劍指 Offer 題解 66 構建乘積陣列

2021-10-02 16:26:00 字數 1513 閱讀 6101

給定乙個陣列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]。不能使用除法

1、若使用可以使用除法,b[i] = 總乘積 / a[i]

2、若暴力解決,連乘後時間複雜度為o(n^2),效率過低

3、b[i] = a[i] 左邊連乘 × a[i]右邊連乘 = c[i] × d[i]

4、任務分解,計算 c[i] = a[0]×a[1]×… ×a[i-1]

int

c =

newint

[n];

int temp =1;

for(

int i =

0; i < n; i++

)

5、計算 d[i] = a[i+1]×…×a[n-1]

int

d =

newint

[n];

int temp =1;

for(

int i = n-

1; i >=

0; i--

)

6、計算b[i] = c[i] × d[i]

int

c =

newint

[n];

int temp =1;

for(

int i =

0; i < n; i++

)int

d =

newint

[n];

temp =1;

for(

int i = n-

1; i >=

0; i--

)for

(int i =

0; i < n; i++

)

至此,問題解決。

但觀察**發現,迴圈計算b[i]時,並未對d[i]修改,是否可以直接在第二個迴圈中,計算出b[i]呢。

int

c =

newint

[n];

int temp =1;

for(

int i =

0; i < n; i++

)temp =1;

for(

int i = n-

1; i >=

0; i--

)

再觀察,發現c[i]分配空間只是為了儲存前面的乘積,是否也可以直接將值儲存在b[i]中。

int temp =1;

for(

int i =

0; i < n; i++

)temp =1;

for(

int i = n-

1; i >=

0; i--

)

至此,問題完美解決。

劍指Offer 66 構建乘積陣列

給定乙個陣列a 0,1,2,3,n 1 請構建乙個陣列b 0,1,2,3,n 1 條件為b i a 0 a 1 a 2 a i 1 a i 1 a n 1 限制 不能使用除法 也就是說b i 等於 a 陣列中除a i 以外的其他所有元素之積 思路1 先來舉例分析一下 例如陣列a 元素個數n 5 b ...

劍指offer 66 構建乘積陣列

給定乙個陣列a,構建乙個陣列 b,其中b中的元素b i a 0 xa 1 x a i 1 xa i 1 x a n 1 不能a使用除法。對於這道題,由於不能使用除法,可以把b i a 0 xa 1 x a i 1 xa i 1 x a n 1 看成是a 0 xa 1 x a i 1 和a i 1 x...

劍指 Offer 66 構建乘積陣列

劍指 offer 66.構建乘積陣列 給定乙個陣列 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 不能使用除法。示例 輸入 1,2,3,4,5 輸出 120,60,40,30,24 所有元素乘積之和不會溢位 3...