劍指Offer 66 構建乘積陣列

2021-08-20 13:28:37 字數 1654 閱讀 3284

給定乙個陣列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[0] = 1*7*2*5*9

b[1] = 4*1*2*5*9

b[2] = 4*7*1*5*9

… 我們發現相當於把a[i]變成了1

題目說除a[i]以外所有元素的乘積, 那麼把a[i]變成1, 也就相當於沒有乘以a[i]

所以我們可以在每次乘之前, 把a[i]變成1, 但是為了後面恢復, 不然後面陣列a都成了1, 所以要用臨時變數儲存a[i]

實現**:

class solution

;int size = a.size();

vector

b(size);

int i = 0;

for(i = 0; i < size; i++)

a[i] = temp;

//printf("b[%d] = %d\n", i, b[i]);

}return b;}};

但是這種方法的時間複雜度為o(n^2), 並且需要改動陣列a, 雖然之後復原了, 但仍有可能出現問題. 為了提高效率和安全性, 再想另一種方法.

思路2:

題目說除a[i]以外所有元素的乘積, 所以可以把a[i]當作乙個分界線, 把乘積分為兩部分

a[0]*a[1]*a[2]*...*a[i-1]a[i+1]*...*a[n-1]

先算出前一部分的乘積, 再乘以後一部分的乘積.

class solution

;int size = a.size();

vector

b(size);

int i = 0;

b[0] = 1;

for(i = 1; i < size; i++)

int temp = 1;

for(i = size - 2; i >= 0; i--)

return b;}};

這樣的時間複雜度為o(n), 而且不會改變陣列 a 的值.

劍指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...

劍指 Offer 66 構建乘積陣列

題目如上。思路如下 我們假設應該返回的答案為陣列ans。顯而易見ans的陣列長度應等於入參a陣列的長度。按照題意,對應於ans陣列中的每乙個元素ans i 其大小應為 ans i a 0 times a 1 times cdots times a i 1 times a i 1 times cdot...