演算法模板:尺取法,字首和,差分陣列
阿新 • • 發佈:2020-09-21
-
尺取法
-
應用:求一個最小區間
-
原理:通過移動左右兩個指標來確認滿足要求的最小區間
-
基本模板:
while(1) { while( cnt<sum && r<n ){ if( check[r++]==0 ) cnt ++; } if(cnt < sum) break; ans = min(ans,r-l); if( --check[l++]==0 ) cnt --; }
-
-
字首和
-
應用:對區間和進行O(1)查詢(重複查詢區間和情況)
-
原理:記錄num[i]的字首和,新陣列的第 i 個數 B[i]是原陣列 A 第 0 到第 i 個數的和
-
模板:
fori { B[i] = i>0 ? B[i-1] + A[i] : A[0]; }
-
拓展:多維字首和:
- sumx,y = sumi-1,j +sumi,j - sumi-1,j-1 + ai,j
-
-
差分
-
應用:O(1)修改區間
-
原理:儲存num[i]-num[i-1]
-
一般與字首和一起使用:
- 關係:原陣列 = cf[i] + cf[i-1],即差分陣列的字首和陣列即為原陣列
-
所以可以很方便的通過維護差分陣列來改變原始陣列
-
例:給原始陣列的
l
到r
區域都加k值//通過差分陣列更新區域 A[l]++;A[r+1]--; //通過字首和還原 fori : B[i] = B[i-1] + B[i];
-