题目:除自身以外数组的乘积
来源:Leetcode
咋一看这道题似乎非常简单,直接用整个数组的乘积除去当前元素不就好了吗,但题目中是有限制不能使用除法的,而且这种做法也是有风险的,一旦出现 0 就失效了。同时,题目还规定,除了输出数组外,我们只能使用常数个空间。那么,我们应该如何思考呢?
左右数组乘积
我们设想下,如果我们能将该数组分为两个部分,一部分是当前元素的左边所有的元素,另一部分是当前元素右边所有的元素,那么,在求除当前元素外数组中所有元素的积时,我们只需要将左部分乘积乘上右部分乘积即可。
但是,题目中要求除掉输出数组,仅可使用常数级空间,因此,我们需要借助数组数组来保存左右两半部分乘积(实际上,只需要保存左半部分乘积即可,因为从右开始遍历时,我们只需要用一个变量保存右边元素的乘积即可)
代码实现过程:
- 先从左到右遍历,ans[i] 中存放 [0, i-1] 部分乘积
- 再从右至左遍历,用一个变量 right 存放 [i, n] 部分乘积
- ans[i] * right 即为所求结果
代码如下:
class Solution:
def productExceptSelf(self, nums: List[int]) -> List[int]:
ans = [1]
left = nums[0]
for l in range(1, len(nums)):
ans.append(left)
left *= nums[l]
right = 1
for r in range(len(nums)-1, -1, -1):
ans[r] = right * ans[r]
right *= nums[r]
return ans