剑指offer(51)构建乘积数组

题目描述

给定一个数组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[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]=C[i-1]*D[i-1],也就是我们要求出 C[i] 和 D[i] 就行,相当于牺牲空间复杂度来换时间复杂度。

第二种解法:第一种解法我们发现需要额外的数组,这明显其实本来是没有必要的,因为B数组的计算就是来自于A,不需要多余的C和D数组,那么有什么更好的办法吗?

我们可以可以直接利用B数组并且借助中间变量tmp来实现,具体看代码。

代码

第一种解法:

function multiply(array) {
    let C = [], D = [], n = array.length;
    C[0] = array[0];
    for (let i = 1; i < n; i++) {
        C[i] = array[i] * C[i - 1];
    }
    D[n-1] = array[n-1];
    for (let i = n - 2; i >= 0; i--) {
        D[i] = array[i] * D[i + 1];
    }
    let B = [];
    B[0]=D[1];
    B[n-1]=C[n-2];
    for (let i = 1; i < n - 1; i++) {
        B[i] = C[i-1] * D[i+1];
    }
    return B;
}

第二种方法:

function multiply(array) {
    let B = [], len = array.length;
    B[0]=1;
     // 计算前i - 1个元素的乘积
    for (let i = 1; i < len; i++) {
        B[i] = array[i-1] * B[i - 1];
    }
    let tmp=1;
     // 计算后N - i个元素的乘积并连接
    for (let i = len-2; i >=0; i--) {
        tmp*=array[i+1];
        B[i]*=tmp;
    }
    return B;
}

猜你喜欢

转载自www.cnblogs.com/wuguanglin/p/multiply.html