给你一个整数数组
nums,返回 数组answer,其中answer[i]等于nums中除nums[i]之外其余各元素的乘积 。题目数据 保证 数组
nums之中任意元素的全部前缀元素和后缀的乘积都在32位 整数范围内。请 不要使用除法,且在
O(n)时间复杂度内完成此题。
示例 1:
输入: nums = [1,2,3,4]
输出: [24,12,8,6]
解法 左右累乘
思路
用两个变量,一个记录左边的累积,一个记录右边的累积。在遍历数组的过程中,每个答案数组中的每项会被刷新两次。第一遍为 i 时,乘以左边的累计乘积。第二遍为n - i 时,乘以右边的累计乘积。
代码
function productExceptSelf(nums: number[]): number[] {
let left: number = 1;
let right: number = 1;
const n: number = nums.length - 1;
const result: number[] = new Array(n + 1).fill(1);
for (let i = 0; i <= n; i++) {
result[i] *= left;
left *= nums[i];
result[n - i] *= right;
right *= nums[n - i];
}
return result;
};
时空复杂度分析
时间复杂度:O(n)
空间复杂度:O(n)