Description
Given an array of n integers where n
> 1,nums
, return an array output such that output[i]
is equal to the product of all the elements of nums except nums[i]
.
Solve it without division and in O(n)
.
For example, given [1,2,3,4]
, return [24,12,8,6]
.
Follow up:
Could you solve it with constant space complexity? (Note: The output array does not count as extra space for the purpose of space complexity analysis.)
Solution
一个简单的O(n)
的想法是把除了这个元素的乘积用一个数组来存储起来,数组的大小和输入的大小一样,然后用两个数组,分别记录顺向累积的结果和反向累积的结果。
也就是说:
对于数组中的一个元素i,我们将从nums[0]
到nums[i-1]
累乘的结果存储到fromBegin[i]
,将从nums[nums.size()-1]
到nums[i+1]
累乘的结果存储到fromLast[i]
中。
为了得到结果的数组,我们只需要将这两个结果相乘即可。
O(1)
的想法:
如果我们不用两个数组来记录这些结果而是使用int
直接记录当前的结果,那么就可以将时间减少到O(1)
代码如下:
Source Code
submission O(n)
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int n=nums.size();
vector<int> fromBegin(n);
fromBegin[0]=1;
vector<int> fromLast(n);
fromLast[0]=1;
for(int i=1;i<n;i++){
fromBegin[i]=fromBegin[i-1]*nums[i-1];
fromLast[i]=fromLast[i-1]*nums[n-i];
}
vector<int> res(n);
for(int i=0;i<n;i++){
res[i]=fromBegin[i]*fromLast[n-1-i];
}
return res;
}
};
submission O(1)
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int n=nums.size();
int fromBegin=1;
int fromLast=1;
vector<int> res(n,1);
for(int i=0;i<n;i++){
res[i]*=fromBegin;
fromBegin*=nums[i];
res[n-1-i]*=fromLast;
fromLast*=nums[n-1-i];
}
return res;
}
};