238. Product of Array Except Self (M)
Given an integer array nums
, return an array answer
such that answer[i]
is equal to the product of all the elements of nums
except nums[i]
.
The product of any prefix or suffix of nums
is guaranteed to fit in a 32-bit integer.
You must write an algorithm that runs in O(n)
time and without using the division operation.
Example 1:
Example 2:
Constraints:
2 <= nums.length <= 105
-30 <= nums[i] <= 30
The product of any prefix or suffix of
nums
is guaranteed to fit in a 32-bit integer.
Follow up: Can you solve the problem in O(1)
extra space complexity? (The output array does not count as extra space for space complexity analysis.)
Solution:
https://www.jiuzhang.com/problem/product-of-array-except-self/ Version 1:
如果暴力计算每个位置的答案值的话,时间会达到O(N^2)
。
如果先将所有数乘起来,每个位置除以当前的数,有可能会整型溢出。
观察可以发现,每个数其实就是它前面部分的积乘以后面部分的积。所有前缀的积,通过一次遍历即可算出来,后缀也是一样。我们可以边乘边算前缀积,同时将他乘在结果数组上,这样达到了O(1)
的额外空间,同时不用到除法。
代码思路
令
result
为一个全是1
的数组。令前缀积
prefixProduct
等于1
,后缀积postfixProduct
等于1
。正序遍历数组
nums
,第i
个位置先将结果乘上prefixProduct
,再将prefixProduct
乘上nums[i]
。逆序遍历数组
nums
,第i
个位置先将结果乘上postfixProduct
,再将postfixProduct
乘上nums[i]
。返回
result
。
复杂度分析
设数组长度为N
。
时间复杂度
遍历两次数组,时间复杂度为
O(N)
。
空间复杂度
只需额外
O(1)
的时间,记录前缀积和后缀积。
Version 2:
Version 1 的空间复杂版。prefixProduct postfixProduct都用数组来装。
Last updated