给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度内完成此题。
function productExceptSelf(nums: number[]): number[] {
const n = nums.length;
const answer: number[] = new Array(n).fill(1);
// 计算前缀乘积
let prefix = 1;
for (let i = 0; i < n; i++) {
answer[i] *= prefix;
prefix *= nums[i];
}
// 计算后缀乘积并与前缀乘积相乘
let suffix = 1;
for (let i = n - 1; i >= 0; i--) {
answer[i] *= suffix;
suffix *= nums[i];
}
return answer;
}
// 示例调用
const nums = [1, 2, 3, 4];
const result = productExceptSelf(nums);
console.log("数组中除自身元素外其余元素的乘积:", result);
代码解释
- 初始化数组:创建一个长度为
n
的数组answer
,并将所有元素初始化为 1,用于存储最终结果。 - 计算前缀乘积:使用一个变量
prefix
来记录前缀乘积,初始值为 1。通过遍历数组,将answer[i]
乘以prefix
,然后更新prefix
为prefix * nums[i]
。这样,answer[i]
就存储了nums[0]
到nums[i - 1]
的乘积。 - 计算后缀乘积并与前缀乘积相乘:使用一个变量
suffix
来记录后缀乘积,初始值为 1。从数组末尾开始向前遍历,将answer[i]
乘以suffix
,然后更新suffix
为suffix * nums[i]
。这样,answer[i]
就存储了nums[0]
到nums[i - 1]
的乘积乘以nums[i + 1]
到nums[n - 1]
的乘积,即除nums[i]
之外其余各元素的乘积。 - 返回结果:遍历结束后,
answer
数组中存储了除自身元素外其余元素的乘积,将其返回。
复杂度分析
- 时间复杂度:O(n),其中 n 是数组
nums
的长度。代码中使用了两次遍历数组的操作,每次遍历的时间复杂度都是O(n) ,因此总的时间复杂度为 。 - 空间复杂度:O(1),除了返回的
answer
数组外,只使用了常数级的额外空间,因此空间复杂度为 。
这种方法通过巧妙地利用前缀乘积和后缀乘积,在不使用除法的情况下,高效地解决了问题。