# 题目描述

给定一个数组 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]。不能使用除法。

提示:

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

# 测试用例

  • 输入: [1,2,3,4,5]
  • 输出: [120,60,40,30,24]

# 分析

这个题关键的是要考虑时间复杂度,因为数组大小很大,所以O(n^2)的复杂度是不可行的,要找一个O(n)时间复杂度的方法

遍历a两次

  • 从左往右,给数组b赋值当前下标左边的乘积,
  • 从右往左,给数组b赋值当前下标右边的乘积

# 代码实现

/**
 * @param {number[]} a
 * @return {number[]}
 */
var constructArr = function(a) {
    // 时间复杂度太大
/*     let b = new Array(a.length);
    for(let i = 0; i < b.length; i ++){
        b[i] = mul(a, i);
    }
    return b; */

    // 遍历两遍数组 —— O(n)
    // 第一遍乘当前下标左边的
    // 第二遍乘当前下标右边的

    // 1 2 3 4 5
    // 0 1 2 3 4

    let res = new Array(a.length).fill(1);
    let mul = 1;
    for(let i = 1; i < a.length; i ++){
        mul *= a[i - 1];
        res[i] = mul;
    }
    mul = 1;
    for(let i = a.length - 2; i >= 0; i --){
        mul *= a[i + 1];
        res[i] *= mul;
    }
    return res;
};

let mul = (arr, index) => {
    let sum = 1;
    for(let i = 0; i < arr.length; i ++){
        if(i != index){
            sum *= arr[i];
        }
    }
    return sum;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42