题目描述:

给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * ... * A[n-1],B[n-1] = A[0] * A[1] * ... * A[n-2];)对于A长度为1的情况,B无意义,故而无法构建,因此该情况不会存在。

解题思路:

该题目可以直接进行暴力求解,每一次进行求解B数组中的每一项时,都把A数组中的n - 1个数据进行相乘,很显然此时的时间复杂度为O(n^2)。

function multiply(array) {
    // write code here
    if (array.length <= 1) {
        return 0;
    }
    let arrayB = [];
    for (let i = 0; i < array.length; i++) {
        let temp = 1;
        for (let j = 0; j < array.length; j++) {
            if (i == j) {
                continue
            }else {
                temp *= array[j];
            }
        }
        arrayB.push(temp);
    }
    return arrayB;
}

不难发现,这种暴力解法进行了大量的重复计算,为了避免重复计算降低时间复杂度,我们分别进行计算,将分为i之前和i之后两部分进行。用两个for循环便可以实现,可以看出,此时时间复杂度降为O(n)

代码实现:

JS

function multiply(array) {
    // write code here
    var arrayB = [];
    if (array.length <= 1) {
        return 0;
    }
    arrayB[0] = 1;
    //分为两部分进行计算
    //第一部分计算i之前的
    for (var i = 0; i < array.length; i++) {
        arrayB[i] = array[i - 1] * array[i - 1];
    }
    var temp = 1;
    //第二部分计算i之前的
    for (var j = array.length; j >= 0 ; j--) {
        var temp = array[j + 1] * temp;
        arrayB[j] = arrayB[j] * temp;
    }
    return arrayB;
}