前言:對於一些列舉演算法題當中,往往會涉及到時間複雜度太高而無法ac的情況
利用字首和的方法可以以空間換時間,是對一些列舉題當中很重要的優化演算法。
下面介紹兩常用的性質上用來輔助的演算法
核心思路:字首和->前n項的和=前n+1項和減去第n+1項
例題應用
隨機給定l和r兩個整數,返回arrays這個整數陣列中第l個元素到第r個元素之和
常規**(時間複雜度o(n*隨機給定的次數))
int sum;
for(int i=l;ireturn sum;
字首和優化(時間複雜度將降為為線性,空間複雜度增加)
預處理:sum[i]=sum[i-1]+arrays[i];//得到一維字首和
int
sum
sum[0]
=arrays[0]
;for
(int i=
1;i)return sum[r]
-sum[l-1]
;
一維差分陣列
預處理:與字首和相同,差分陣列需要進行預處理
即dis[i]=a[i]-a[i-1]
即dis陣列中存放的是a陣列相鄰的兩個數字的差值。
這裡我們設a[0]=0;
則a[i]利用遞推思想(和高中的陣列求和有點像哈)
可求得a[i]=dis[1]+dis[2]+…dis[i];
例題:現在有乙個長度為n的數字序列(首項為0),現在要對他進行區間修改(將區間的所有數加上乙個數),你需要輸出修改m次後得到的序列是什麼,需要你涉及乙個o(m)的演算法
for(int i=
1;iwhile
(m--
)for(int i=
1;i<=a.length;i++)
總結差分陣列用途:
既然我們要對區間進行修改,那麼差分陣列的作用一定就是求多次進行區間修改後的陣列
注意只能是區間元素同時增加或減少相同的數的情況才能使用。
差分陣列與字首和
字首和 字首和顧名思義就是前面i個數的總和。假設有乙個序列a,字首和為s。根據概念很容易知到公式 s i displaystyle sum ia j 如何求區間 l,r 的和呢?sum l,r s r s l 1 那如果要對多個不同區間 l,r 進行加減操作呢?然後輸出某個區間 l,r 的區間和,接...
字首和 差分陣列 刷題總結
字首和主要適用的場景是原始陣列不會被修改的情況下,頻繁查詢某個區間的累加和。字首和,核心 就是下面這段 class prefixsum 查詢閉區間 i,j 的累加和 public intquery int i,int j prefix i 就代表著nums 0.i 1 所有元素的累加和,如果我們想求...
二維差分陣列和二維字首和的個人看法
一維差分陣列和字首和都挺熟悉的,做題在打cf的時候做到了乙個看別人用二維差分陣列求字首和的題,驚呆了,於是來補了下這方面的知識。在學習和理解二維的時候,我們拿一維來對比就行了,思想是類似的但是略有所不同。設乙個二維陣列a i j 那麼它的二維字首和即為從 i,j 到原點 0,0 所有數之和,或者說這...