一天一到演算法題 乘積分析

2021-06-23 02:02:08 字數 814 閱讀 9846

給你乙個陣列a[1..n],請你在o(n)的時間裡構造乙個新的陣列b[1..n],使得b[i]=a[1]*a[2]*...*a[n]/a[i]。你不能使用除法運算。

如果直接暴力,時間為o(n^2),所以要優化

我們看到  b[i]=a[1]*......a[i-1]*a[i+1]*......a[n];

分成兩份:第一部分是

a[1]*......a[i-1]

第二部分是

a[i+1]*......a[n]

所以,計算b[i+1]時,就是用

b[i]的第一部分乘上

a[i]得到b[i+1]的第一部分

而第二部分,得到

a[i+1]*......a[n],要再得到a[i]*

a[i+1]*......a[n],只需乘上a[i],

另開陣列c,d

c[i]=

a[1]*......a[i-1]=c[i-1]*a[i-1];

d[i]=

a[i+1]*......a[n]=d[i+1]*a[i+1];

這是自己寫的,有錯誤請指出

#include

int a[100],b[100],c[100],d[100];

int main()

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

d[i]=d[i+1]*a[i+1];

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

printf("\n");

}return 0;

}

一天一道演算法題 樹狀陣列

題目 模板 樹狀陣列1 樹狀陣列和線段樹差不多,可以處理區間操作,但是處理不了太複雜的區間問題。不過 比線段樹簡潔很多很多!時間複雜度都為o logn 例如,區間 1,8 儲存方式如下 1 tree 1 num 1 001 001 2 tree 2 num 2 num 1 010 010 001 3...

一天一道演算法題 線段樹

題目 模板 線段樹1 rmq問題 range minimum maximum query 和求區間和的問題可以用暴力法做,時間複雜度為o n 2 用在本題會超時,所以我們選擇線段樹做。線段樹是一種用於區間操作的資料結構,用二叉樹構造。如圖。線段樹的每個節點代表了乙個區間。防止超時,用了lazy標記。...

一天一道演算法題 5 24 遞迴

我們每一天都應該比昨天更強一點 觀察下列式子 12 12 1 12 6 2 12 4 3 12 3 4 12 3 2 2 12 2 6 12 2 3 2 12 2 2 3 對於給定的n 計算n公有多少種不同的分解式?1 include 2 using namespace std 34 int cnt...