給定乙個陣列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無意義,故而無法構建,因此該情況不會存在。
示例1輸入
[1,2,3,4,5]
返回值[120,60,40,30,24]
思路1:最開始想的就是將所有數字乘起來,再除以對應位置的數字。但是規定不能用除法,並且假如有0就很難實現了
思路2:暴力計算
class
solution
ret.
push_back
(temp);}
return ret;}}
;
時間複雜度o(n^2)
時間複雜度這麼高的原因就是在後面的運算中一直從頭開始乘,我們可以用乙個方式將之前的結果儲存起來。
思路2:
先將指定位置的左邊都乘起來a1
2345
6b左11
2624120
這樣就得到了每個位置左半部分的乘積(位置0沒有左邊,直接設定為1就行了)即:
b[i]=b[i-1]*a[i-1]
再從右到左乘好右半部分:a1
2345
6b左11
2624120
b1* 2* 3* 4* 5*6
1* 3* 4* 5*6
2* 4* 5*6
6* 5*6
24*120
120這時候需要從左到右維持乙個變數儲存右邊的值,這個變數初始化為最右邊的數,迴圈從倒數第2個開始。
實現:
class
solution
int temp=1;
for(
int i=len-
2;i>=
0;i--
)//第二輪迴圈從右邊倒數第二個開始往左邊迴圈(因為最後乙個是沒有右邊的)
return ret;}}
;
劍指offer 51 構建乘積陣列
給定乙個陣列a 0,1,n 1 請構建乙個陣列b 0,1,n 1 其中b中的元素b i a 0 x a 1 x x a i 1 x a i 1 x x a n 1 不能使用除法。由題目可知b i a 0 x a 1 x x a n 1 a i 題目裡面不能用除法 計算右邊的三角 也就是d i int...
劍指offer 51 構建乘積陣列
不能使用除法,那麼就構建兩個陣列 陣列1 larr,第一位是1,其餘位的數是a0a1 ai 1 陣列2 rarr,最後一位是1,其餘位是ai 1ai 2 an 1 最後返回b,b的每一位是larr i rarr i class solution def multiply self,a write c...
劍指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 不能使用除法。乙個for迴圈裡面巢狀兩個for迴圈即可 public int multiply int a int b new int a.length for...