除自身以外数组的乘积
题目
给你一个整数数组 nums
, 返回 数组 answer
, 其中 answer[i]
等于 nums
中除 nums[i]
之外其余各元素的乘积.
题目数据** 保证**数组 nums
之中任意元素的全部前缀元素和后缀的乘积都在 32 位整数范围内.
请不要使用除法, 且在 O(n)
时间复杂度内完成此题.
进阶: 你可以在 O(1)
的额外空间复杂度内完成这个题目吗? (出于对空间复杂度分析的目的, 输出数组不被视为额外空间.)
提示:
2 <= nums.length <= 10⁵
-30 <= nums[i] <= 30
- 保证数组
nums
之中任意元素的全部前缀元素和后缀的乘积都在 32 位整数范围内
示例
输入: nums = [1,2,3,4]
输出: [24,12,8,6]
输入: nums = [1,2,3,4]
输出: [24,12,8,6]
题解
类似于前缀和, 这里是前缀积.
- JavaScript - O(n) 空间复杂度
- JavaScript - O(1) 空间复杂度
/**
* @param {number[]} nums
* @return {number[]}
*/
var productExceptSelf = function (nums) {
const n = nums.length
const pre = new Array(n).fill(1)
const suf = new Array(n).fill(1)
for (let i = 1; i < n; i++) {
pre[i] = pre[i - 1] * nums[i - 1]
}
for (let i = n - 2; i >= 0; i--) {
suf[i] = suf[i + 1] * nums[i + 1]
}
const result = new Array(n)
for (let i = 0; i < n; i++) {
result[i] = pre[i] * suf[i]
}
return result
}
/**
* @param {number[]} nums
* @return {number[]}
*/
var productExceptSelf = function (nums) {
const n = nums.length
const suf = new Array(n).fill(1)
for (let i = n - 2; i >= 0; i--) {
suf[i] = suf[i + 1] * nums[i + 1]
}
let pre = 1
for (let i = 0; i < n; i++) {
suf[i] *= pre
pre *= nums[i]
}
return suf
}