劍指Offer之構建乘積數組

題目描述:

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

題目分析:

剛開始看題目,題目都沒看懂,後來才知道題目意思:給你一個數組a[],你需要做的就是輸出數組b[],它的第 i 項的元素等於a數組的每項元素的乘積,注意:1)這個乘積不包括第 i 項。2)題目明確說明,不能用除法。


思路分析:

b
b[0] 1 a[1] a[2] a[3] a[4] a[n - 1]
b[1] a[0] 1 a[2] a[3] a[4] a[n - 1]
b[2] a[0] a[1] 1 a[3] a[4] a[n - 1]
b[3] a[0] a[1] a[2] 1 a[4] a[n - 1]
b[4] a[0] a[1] a[2] a[3] 1 a[n - 1]
b[n - 1] a[0] a[1] a[2] a[3] a[4] 1

b爲結果數組,可以看到:b[i] = a[0] * a[1] *… * a[i - 1] * 1 *a[i + 1] *…*a[n - 1];
可以將b[i]的結果分成2部分來進行計算,先算左下部分,後算右上部分,然後乘起來存入結果數組b中。


參考代碼:

public int[] constructArr(int[] a) {
   if(a == null || a.length == 0)return new int[]{};
   int[] b = new int[a.length];
   b[0] = 1;
   /** 計算左上部分的乘積 **/
   for(int i = 1; i < a.length; i++){//從索引1開始
      b[i] = b[i - 1] * a[i - 1];
   }
   /** 計算右下部分的乘積 **/
   int last = 1;//設置臨時變量
   for(int i = a.length - 2; i >= 0; i--){//這裏是從後往前計算
      last *= a[i + 1];
      b[i] *= last; 
   }
   return b;
}

注意事項:

左上部分從前往後計算,況且每次計算b[i]都會用到前一次計算的累乘結果b[i - 1],即前一次計算的結果放在b中右下部分是從後往前計算,每次計算b[i]都會用到上一次計算b[i+1]左上部分的累乘結果,而這個結果不能通過b[i+1]得到,所以設置一個臨時變量last,記錄上次b[i+1]累乘時左上角計算的結果;


(完)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章