解题思路:
用两个数组,分别记录第i个元素左边所有数的乘积和右边所有数的乘积。
最后将两个数组相乘就是结果了。
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int n=nums.size();
vector<int>left_product(n); //记录i左边的乘积
vector<int>right_product(n); //记录i右边的乘积
left_product[0]=1; //0左边没有数,初始化为0
right_product[n-1]=1; //最后一个元素右边没有数,初始化为0
for(int i=1;i<n;++i){
left_product[i]=left_product[i-1]*nums[i-1];
}
for(int i=n-2;i>=0;--i){
right_product[i]=right_product[i+1]*nums[i+1];
}
vector<int>res(n);
for(int i=0;i<n;++i){
res[i]=right_product[i]*left_product[i];
}
return res;
}
};
空间复杂度的优化
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int n=nums.size();
vector<int> product(n);
product[0]=1;
for(int i=1;i<n;++i){
product[i]=product[i-1]*nums[i-1];
}
int tmp=1;
for(int i=n-1;i>=0;--i){
product[i]*=tmp; //左边的数乘以右边的数
tmp*=nums[i]; //更新tmp,这时的tmp是nums[i-1]右边的数乘积
}
return product;
}
};