前言
这篇 blog 借(抄)鉴(袭)了很多这篇日报的内容。当然,我强烈推荐大家阅读那篇日报。
定义
尺取法,又称双指针(Two pointers),一般都是求一个区间内满足某种性质的最优解。
尺取法的求解过程:每次交替移动 l,r 指针,在移动指针的过程中更新求得的解。
模板
for循环
for(int i=1,j=n;i<j;i++;j--)
while循环
int i=1,j=n;
while(i<j){
i++;
j--;
}
例题
P1638(求刚好拥有所有 m 种数字的最短区间)
int ans=INT_MAX;
for(int l=1,r=0,now=0;l<=n;){
while(now<m && r<n){
r++;
if(!cnt[a[r]])
now++;
cnt[a[r]]++;
}
if(now<m)
break;
ans=min(ans,r-l+1);
cnt[a[l++]]--;
if(!cnt[a[l]])
now--;
}