题目
给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。
说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题
进阶:使用常数空间复杂度
思路
- 第一次建立两个数组,分别表示nums前缀和后缀的乘积,最后结果将前缀和后缀相乘即可(虽能通过,但是不符合常数空间复杂度)
- 减少空间复杂度,可以将前缀乘积写入结果数组中,然后从后向前循环用一个整数变量得到后缀乘积,并相乘。
代码
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
//空间复杂度较高
// int len = nums.size();
// vector<int> left(len, 0), right(len, 0);
// vector<int> ans(len);
// for(int i=0;i<len;i++){
// if(i==0) right[i] = 1;
// else right[i] = right[i-1]*nums[i-1];
// }
// for(int i=len-1;i>=0;i--){
// if(i==len-1) left[i]=1;
// else left[i]=left[i+1]*nums[i+1];
// }
// for(int i=0;i<len;i++){
// ans[i] = left[i]*right[i];
// }
// return ans;
int len = nums.size();
vector<int> ans(len);
ans[0] = 1;
for(int i=1;i<len;i++){
ans[i] = ans[i-1]*nums[i-1];
}
int f=1;
for(int i=len-1;i>=0;i--){
ans[i] = ans[i]*f;
f = f*nums[i];
}
return ans;
}
};