劍指offer51 構建乘積陣列

2021-10-19 20:56:10 字數 1104 閱讀 6661

給定乙個陣列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...