16.除自身以外数组的乘积

62 阅读1分钟

题目链接

给你一个整数数组 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)