一維字首和與差分陣列

2021-10-21 17:53:06 字數 1179 閱讀 2817

前言:對於一些列舉演算法題當中,往往會涉及到時間複雜度太高而無法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 所有數之和,或者說這...