给你一个整数数组 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]
解题思路
本题要求提供一个数组,我们需要返回一个数组,数组中存储提供数组的除去当前下标位置的元素的剩余元素的乘积。
首先我们定义一个外层for循环,用来更新数组下标位置,从零开始;
在for循环中在嵌套两个并列的for循环,分别用来记录当前下标位置前面所有元素的乘积和当前下标位置后面所有元素的乘积;
然后if判断下标位置在哪里:
- 如果下标位置为0,则将记录当前下标后面所有元素的乘积值存进定义的数组中;
- 如果下标的位置为nums.length,则将记录当前下标前面所有元素的乘积值存进定义的数组中;
- 如果下标位置在0和nums.length之间,则将两组乘积值乘到一起存进定义的数组中。
以此类推,直至外层for循环循环至nums最后,return定义的数组。
var productExceptSelf = function(nums) {
let answer = [];
for(let i = 0; i < nums.length; i++){
let sumL = 1;
let sumR = 1;
let res = 0;
for(let j = 0; j < i; j++){
sumL = sumL*nums[j];
};
for(let m = i+1; m < nums.length; m++){
sumR = sumR*nums[m];
}
// if(i == 0){
// res = sumR;
// }else if(i == nums.length-1){
// res = sumL;
// }else{
// res = sumL*sumR;
// }
res = sumL*sumR;
answer.push(res);
}
return answer;
};
另一种思路:
每个位置的结果就是其前面所有元素的乘积和后面所有元素的乘积。
首先定义一个数组answer,从0开始遍历,将每个位置的元素的前面所有元素的乘积先存入数组answer中,遍历至最后出循环;
然后再从nums.length-1开始遍历,将每个位置后面所有元素的乘积与answer[当前位置]值相乘。
例如:
要求数组[1,2,3,4]
//从0开始遍历
第一次遍历answer值[1,1,2,6]
//从nums.length-1开始遍历
第二次遍历answer值[24,12,8,6]
var productExceptSelf = function(nums) {
let answer = [];
let k = 1;
for(let i = 0; i < nums.length; i++){
answer[i] = k;
k = k*nums[i];
}
let m = 1;
for(let j = nums.length - 1; j >= 0; j--){
answer[j] = answer[j]*m;
m = m*nums[j];
}
return answer;
};