構建乘積數組

給定一個數組 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]。要求不能使用除法。java

 

 

B[i]的值能夠看做下圖的矩陣中每行的乘積。數組

下三角用連乘能夠很容求得,上三角,從下向上也是連乘。3d

所以咱們的思路就很清晰了,先算下三角中的連乘,即咱們先算出B[i]中的一部分,而後倒過來按上三角中的分佈規律,把另外一部分也乘進去。code

例如:A[]={1,2,3}求B[] 
B[0]=A[1]×A[2]=2×3=6 
B[1]=A[0]×A[2]=1×3=3 
B[2]=A[0]×A[1]=1×2=2

1.B[0]初始化爲1,從下標i=1開始,先求出C[i]的值並放入B[i],即 B[i]=C[i]=C[i-1]×A[i-1],因此B[1]=B[1-1]×A[1-1]=B[0]×A[0]=1×1=1,i++

2.B[2]=B[2-1]×A[2-1]=B[1]×A[1]=1×2=2,i++超出長度中止循環

3.C[i]計算完畢求D[i],設置一個臨時變量temp初始化爲1

4.從後往前變量數組,LengthA=3,初始化 j =A.Length-2=1,結束條件爲 j >=0

5.第一次循環,temp = temp×A[i+1]=1×A[2]=3,計算出 A 中最後一個元素的值放入temp,temp 至關於 D[ i ]的值

6.由於以前的 B [ i ]=C[ i ],因此讓 B[ i ]×D[ i ]就是要保存的結果,即B[j]=B[1]=B[1]×temp=1×3=3,i–=0

7.計算B[ j ]=B[ 0 ],temp 上一步中的值是A[ 2 ] ,在此次循環中temp=temp×A[0+1]=A[2]×A[1]=3×2=6

8.B[i]=B[0]=B0]×temp=1×6=6,i–<0循環結束

因此B數組爲{6,3,2}
public class Solution {
    public int[] multiply(int[] A) {
        int length = A.length;
        int[] B = new int[length];
        if(length != 0 ){
            B[0] = 1;
            //計算下三角連乘
            for(int i = 1; i < length; i++){
                B[i] = B[i-1] * A[i-1];
            }
            int temp = 1;
            //計算上三角
            for(int j = length-2; j >= 0; j--){
                temp *= A[j+1];
                B[j] *= temp;
            }
        }
        return B;
    }
}

 

length -1 是最後一個,最後一個爲1,temp = 1就已是最後一個的值,那麼從length - 2開始就是An-1,就如同下三角的計算是從1開始,不從0開始。blog

相關文章
相關標籤/搜索