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