问题描述
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。
题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
请不要使用除法,且在 O(n) 时间复杂度内完成此题。
输入: nums = [1,2,3,4]
输出: [24,12,8,6]
解题思路:二分法
1. 定义3个数组left, right, res,其中left[i]表示在nums数组中第i个元素之前所有元素的乘积,right[i]表示在在nums数组中第i个元素之后所有元素的乘积,res表示结果数组
2.初始化left[0] = 1,随后的值如下所示
3.初始化right[nums.length - 1] = 1,随后的值如下所示
4.将left和right两个数组对应元素相乘,得到最终的结果
代码实现(js)
/**
* @param {number[]} nums
* @return {number[]}
*/
var productExceptSelf = function(nums) {
// 1.定义两个数组left, right,left[i]表示nums[i]之前所有元素乘积
let left = new Array(nums.length).fill(1)
let right = new Array(nums.length).fill(1)
let res = new Array(nums.length).fill(1)
// 2.设置left和right两个数组的值
for(let i = 1; i < nums.length; i++){
left[i] = left[i - 1] * nums[i - 1]
}
for(let j = nums.length - 2; j >= 0; j--){
right[j] = right[j + 1] * nums[j + 1]
}
// 3.将left和right两个数组对应元素相乘
for(let i = 0; i < nums.length; i++){
res[i] = left[i] * right[i]
}
return res
};