劍指offer 構建乘積陣列

2021-09-25 02:46:21 字數 857 閱讀 4030

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

無法使用除法,正常連乘的話時間複雜度為o(n^2),效率非常低。

考慮到計算每個b[i]時都會有重複,思考b[i]之間的聯絡,找出規律,提高效率。

如上圖所示,可以發現:

b[i]的左半部分(紅色部分)和b[i-1]有關(將b[i]的左半部分乘積看成c[i],有c[i]=c[i-1]*a[i-1]),

b[i]的右半部分(紫色部分)與b[i+1]有關(將b[i]的右半部分乘積看成d[i],有d[i]=d[i+1]*a[i+1]),

因此我們先從0到n-1遍歷,計算每個b[i]的左半部分;  然後定義乙個變數temp代表右半部分的乘積,從n-1到0遍歷,令b[i]*=temp,而每次的temp與上次的temp關係即為temp*=a[i+1]。

public class solution 

int tmp=1;

for(int i=n-2;i>=0;i--)

return b;}}

1.考慮到了陣列b中的元素間有關係,要進一步分析。本題就是採用畫圖的方法,將b看成乙個矩陣,就能輕易地看出元素之間的關係了。好好學習。

2.可以直接從頭到尾再從尾到頭遍歷,不需要建立兩個臨時陣列c和d。自己寫**時,要盡量設計不用建立太多記憶體空間。

3.如果這道題可以用除法的話,記得除數不能為零!

劍指offer 構建乘積陣列

給定乙個陣列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 i 可以按公式給出的方法,乙個個求解。時間複雜度為o n 2 解法二 將b i 的求解分為兩...

《劍指offer》 構建乘積陣列

給定乙個陣列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 暴力解法。1 假設a 1,2,3 那麼b 0 a 1 a 2 b 1 a 0 a 2 b 2 a 0 a 1 2 可以發現規律,b ...

劍指offer 構建乘積陣列

描述題目 給定乙個陣列a 0,1,n 1 請構建乙個陣列b 0,1,n 1 其中乙中的元素b i a 0 a 1 a i 1 a 1 1 a n 1 不能使用除法。class solution vector res n,0 res 0 a 1 res 1 a 0 int multi a 0 a 1 ...