題目描述:
給定一個數組 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]累乘時左上角計算的結果;
(完)