Learn the idea from https://leetcode.com/discuss/49667/o-n-time-and-o-1-space-c-solution-with-explanation.
O(n) time and O(n) space method:
Take [1,2,3,4] as an example, fromBegin will be [1,1*1,1*1*2,1*1*2*3], and fromEnd will be [1,1*4,1*4*3,1*4*3*2]. So the result can be derived from multiplying numbers from the two vectors.
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int n=nums.size();
vector<int> res(n,1);
vector<int> fromBegin(n,1);
vector<int> fromEnd(n,1);
for(int i=1;i<n;i++)
{
fromBegin[i]=fromBegin[i-1]*nums[i-1];
fromEnd[i]=fromEnd[i-1]*nums[n-i];
}
for(int i=0;i<n;i++)
res[i]*=fromBegin[i]*fromEnd[n-i-1];
return res;
}
};
Here, I can reduce the space complexity by using only two variables.
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int n=nums.size();
vector<int> res(n,1);
int fromBegin=1;
int fromEnd=1;
for(int i=0;i<n;i++)
{
res[i]*=fromBegin;
fromBegin*=nums[i];
res[n-i-1]*=fromEnd;
fromEnd*=nums[n-i-1];
}
return res;
}
};