剑指offer_66_构建乘积数组【javascript】

62 阅读1分钟

题目链接

leetcode.cn/problems/go…

题目(中等)

给定一个数组A[0,1,...,n-1],请构建一个数组 B[0,1,...,n-1],其中 B[i] 的值是数组 A 中除了下标 i 以外的元素的积,即 B[i]=A[0]×A[1]×...×A[i-1]×A[i+1]×...×A[n-1]。不能使用除法,且要求不能用任何额外的空间。

示例 1:

输入:arrayA = [2, 4, 6, 8, 10]
输出:[1920, 960, 640, 480, 384] 

提示:

  • 所有元素乘积之和不会溢出 32 位整数
  • arrayA.length <= 100000

题解

  • 时间复杂度 O(N): 其中 N 为数组长度,两轮遍历数组 A ,使用 O(N) 时间。
  • 空间复杂度 O(1): 变量 tmp 使用常数大小额外空间(数组 B 作为返回值,不计入复杂度考虑)
/**
 * @param {number[]} arrayA
 * @return {number[]}
 */
var statisticalResult = function(arrayA) {
    let len = arrayA.length;
    if (!len) {
        return [];
    }
    let arrayB = new Array(len);
    arrayB[0] = 1;
    let tmp = 1;
    for(let i = 1; i < len; i++) {
        arrayB[i] = arrayB[i - 1] * arrayA[i - 1];
    }
    for(let i = len - 2; i >= 0; i--) {
        tmp *= arrayA[i + 1];
        arrayB[i] *= tmp;
    }
    return arrayB;
};