给你一个整数数组 nums
,返回 数组 answer
,其中 answer[i]
等于 nums
中除 nums[i]
之外其余各元素的乘积 。
题目数据 保证 数组 nums
之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
请不要使用除法,且在 O(n)
时间复杂度内完成此题。
示例 1:
输入: nums =[1,2,3,4]
输出:[24,12,8,6]
示例 2:
输入: nums = [-1,1,0,-3,3] 输出: [0,0,9,0,0]
1、思路
看到这个题,我们首先会想到使用除法,但题目中明确要求不能使用除法。
我们再看题目要求题目数据 保证 数组 nums
之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内,那就可以按照把 nums[i]左边和右边的元素全部累乘即可。
首先定义左右两边的初始值;left = 1,right = 1;
然后具体的思路会在代码中呈现,便于理解。这里我们把运行的过程写了一下。
【 1 2 3 4 】
左边: 1 1*1 1*1*2 1*1*2*3
右边: 1*2*3*4 1*3*4 1*4 1
总的:1*1*2*3*4 1*1*1*3*4 1*1*1*2*4 1*1*2*3*1
2、代码段
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int n = nums.size();
int left = 1,right = 1;
vector<int>res(n,1);
for(int i = 0;i < n;i++)
{
res[i] *= left;
// 乘以其左边的乘积;
left *= nums[i];
// 从左边开始累乘;
res[n - i -1] *= right;
// 乘以右边的乘积;
right *= nums[n - i - 1];
//从右边开始累乘;
}
return res;
}
};