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 1(C++)
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;
}
};
Solution 2(C++)
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;
}
};
算法分析
这个还是见过以前类似的方法,从前往后一遍,从后往前一遍,就可以了。可能看起来不容易懂,但是我确实做过类似方法的题目,
其实, a1 * a2 * a3 * … * ai-1 * ai+1*… * an-1 an。可以分为两部分:a1 a2 * a3 * … * ai-1 , 和 ai+1*… * an-1 *an,这个两部分一个只与前面有关,一个只与后面有关,自然就可以想到这个从前往后与从后往前两遍了。
程序分析
注意编程时索引编号。