算法模板:尺取法,前缀和,差分数组
-
尺取法
-
应用:求一个最小区间
-
原理:通过移动左右两个指针来确认满足要求的最小区间
-
基本模板:
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];
-