除了自己的所有乘积可以看为自己左边的所有元素乘积与右边的所有元素乘积相乘。创建一个数组记录每一项所有左边元素的乘积。之后再倒序计算每项右边元素的乘积,同时乘上左边的。第二次就不用新开一个数组记录右边的乘积了,用一个变量就行,算一次就直接与left数组相乘拿到最后结果。
/**
* @param {number[]} nums
* @return {number[]}
*/
var productExceptSelf = function(nums) {
// 左边
let left = []
left[0] = 1
for(let i = 1; i< nums.length;i++){
left[i] = left[i-1] * nums[i-1]
}
// 记录每一项所有右边乘积
let r = 1
for(let j = nums.length - 1; j >= 0; j--){
left[j] = r * left[j] // 直接得到最终结果
r = r * nums[j] // 更新所有右边乘积
}
return left
};