1.题目描述
示例 1:
输入: nums = [1,2,3,4]
输出: [24,12,8,6]
示例 2:
输入: nums = [-1,1,0,-3,3]
输出: [0,0,9,0,0]
2.解题思路
思路1:(0要单独处理)
1)第一次循环算出所有元素的乘积all
2)第二次循环遍历每个元素,算出all/nums[i]并加入结果数组res
思路2:(不用除法)
1)第一次循环从前往后循环(index从1到size -1),算出nums[i]左边的所有元素乘积,保存到left数组中
2)第二次循环从后往前循环(index从size-2到0),算出nums[i]右边的所有元素乘积,保存到right数组中
3)从前往后算,index从0到size-1,每次都计算res[i] = left[i] * right[i],返回res即可
3.代码
cpp
vector<int> productExceptSelf(vector<int>& nums) {
int size=nums.size();
if(size==0){
return {};
}
vector<int> left(size);
vector<int> right(size);
vector<int> res(size);
left[0] = 1;
right[size-1]=1;
//先算nums[i]的左边所有元素的乘积,从前往后算
for(int i =1; i<=size -1 ;i++ ){
left[i] = left[i-1] * nums[i-1];
}
//算nums[i]的右边所有乘积,从后往前算
for(int j = size -2;j>=0;j--){
right[j] = right[j+1]*nums[j+1];
}
//开始计算nums[i]左边乘积 乘以 右边乘积
for(int i = 0;i<=size-1;i++){
res[i] = left[i]*right[i];
}
return res;
}