题目:238. 除自身以外数组的乘积
思路:前缀和,先求出nums[i]元素左侧R和右侧L的乘积,那么当前位置i的答案即为v[i]=L*R。这样只需要两趟for循环即可得到左、右侧的乘积。时间复杂度0(n)。
要做到0(1)的空间复杂度,那就是先将“输出数组v”保存一侧的乘积和,然后再进行for循环求出右侧的乘积和,同时更新v。细节看注释
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int n=nums.size();
//输出数组
vector<int> v(n,0);
//是先将“输出数组v”保存左侧的乘积和
v[0]=nums[0];
for(int i=1;i<n;i++){
v[i]=v[i-1]*nums[i];
}
//tmp保存右侧的乘积和
int tmp=1;
for(int i=n-1;i>0;i--){
v[i]=v[i-1]*tmp;
tmp*=nums[i];
}
v[0]=tmp;
return v;
}
};