238. 除自身以外数组的乘积 (前缀和)
给你一个整数数组 nums
,返回 数组 answer
,其中 answer[i]
等于 nums
中除 nums[i]
之外其余各元素的乘积 。
题目数据 保证 数组 nums
之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
请不要使用除法,且在 O(n)
时间复杂度内完成此题。
示例 1:
输入: nums =[1,2,3,4]
输出:[24,12,8,6]
示例 2:
输入: nums = [-1,1,0,-3,3] 输出: [0,0,9,0,0]
提示:
2 <= nums.length <= 105
-30 <= nums[i] <= 30
- 保证 数组
nums
之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内
进阶:你可以在 O(1)
的额外空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组不被视为额外空间。)
class Solution: def productExceptSelf(self, nums: List[int]) -> List[int]: n = len(nums) a = [1]*n b = [1]*n a[0] = nums[0] b[-1] = nums[-1] for i in range(1,n): a[i] = a[i-1] * nums[i] for i in range(0,n-1)[::-1]: b[i]= b[i+1]*nums[i] res = [1] * n res[0] = b[1] res[n-1] = a[n-2] for i in range(1,n-1): res[i] = a[i-1] * b[i+1] return res
class Solution { public: vector<int> productExceptSelf(vector<int>& nums) { int n = nums.size(); vector<int> s1(n+2,1); vector<int> s2(n+2,1); for(int i = 1; i <= n ;i++) { s1[i] = s1[i-1] * nums[i-1]; } for(int i = n; i>=1;i--) { s2[i] = s2[i+1] * nums[i-1]; } vector<int> res; for(int i = 1; i <= n;i++) { int a = s1[i-1] * s2[i+1]; res.emplace_back(a); } return res; } };
降维:
class Solution { public: vector<int> productExceptSelf(vector<int>& nums) { int n = nums.size(); vector<int> res(n,1); int dp_last = 1; for(int i = 1; i <= n ;i++) { res[i-1] = dp_last; dp_last*=nums[i-1]; } dp_last = 1; for(int i = n; i>=1;i--) { res[i-1] *= dp_last; dp_last*=nums[i-1]; } return res; } };