LeetCode //238. Product of Array Except Self
发布人:shili8
发布时间:2024-12-26 02:26
阅读次数:0
**Product of Array Except Self**
###问题描述给定一个长度为 n 的整数数组 `nums`,返回一个数组 `ans`,其中 `ans[i] = nums[0] * nums[1] * ... * nums[n-1] / nums[i]`。换句话说,返回一个新数组,其中每个元素都是原始数组中所有其他元素的乘积。
### 示例* 输入:`nums = [1,2,3,4]`
输出:`[24,12,8,6]`
* 输入:`nums = [-1,1,0,-2,-3]`
输出:`[-24,24,0, -12, -18]`
### 解决方案#### 方法一:使用额外空间的前缀乘积和后缀乘积我们可以先计算出数组中每个元素左边所有元素的乘积(称为 `left`),再计算出右边所有元素的乘积(称为 `right`)。然后,我们将 `left` 和 `right` 相乘,得到最终结果。
class Solution: def productExceptSelf(self, nums: List[int]) -> List[int]: n = len(nums) # 计算前缀乘积 left = [1] * n for i in range(1, n): left[i] = left[i -1] * nums[i -1] # 计算后缀乘积 right = [1] * n for i in range(n -2, -1, -1): right[i] = right[i +1] * nums[i +1] # 将前缀乘积和后缀乘积相乘 return [left[i] * right[i] for i in range(n)]
#### 方法二:不使用额外空间的前缀乘积我们可以先计算出数组中每个元素左边所有元素的乘积(称为 `left`),然后再计算出右边所有元素的乘积(称为 `right`)。但是,这次,我们只用一个变量来存储 `left` 和 `right` 的值。
class Solution: def productExceptSelf(self, nums: List[int]) -> List[int]: n = len(nums) # 计算前缀乘积 left =1 for i in range(n): left *= nums[i] # 计算后缀乘积 right =1 for i in range(n -1, -1, -1): right *= nums[i] # 将前缀乘积和后缀乘积相乘 return [left * right // num for num in nums]
#### 方法三:不使用额外空间的后缀乘积我们可以先计算出数组中每个元素右边所有元素的乘积(称为 `right`),然后再计算出左边所有元素的乘积(称为 `left`)。但是,这次,我们只用一个变量来存储 `left` 和 `right` 的值。
class Solution: def productExceptSelf(self, nums: List[int]) -> List[int]: n = len(nums) # 计算后缀乘积 right =1 for i in range(n -1, -1, -1): right *= nums[i] # 计算前缀乘积 left =1 for i in range(n): left *= nums[i] # 将前缀乘积和后缀乘积相乘 return [left * right // num for num in nums]
### 总结本题要求我们计算出一个数组中每个元素左边所有元素的乘积和右边所有元素的乘积,然后将这两个值相乘得到最终结果。我们可以使用额外空间来存储前缀乘积和后缀乘积,也可以不使用额外空间直接计算出这些值。