题目传送门
这道题就是求A,B的一段区间的端点
就是能够覆盖所有的画家的话画,区间长度越短越好,
求解有m个不同元素的最小区间的端点
不同元素的数量等于m
这道题用 尺取法 去做
尺取法的优化方式
●双"指针",(端点的位置)
●队列
应用场景:求解满足条件的连续区域的求和 / 计数
for(int i=1;i<=n;i++) { if(a[i]) { sum[i]=sum[i-1]+a[i]; } else { } }
AC代码这样写:
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int a[N];
int ansr,ansl,cnt[N];
int main()
{
int m,n;
cin>>n>>m;
for(int i=1;i<=n;++i)
cin>>a[i];
int l=1,r=1;
int diff=1;
int ansl=1,ansr=n;
cnt[a[1]]++;
while(l<=r && r<n)
{
while (r<n && diff<m)
{
r++;
cnt[a[r]]++;
if(cnt[a[r]]==1) diff++;
}
while(l<r && diff==m)
{
if(r-l<ansr-ansl)
{
ansl=l;
ansr=r;
}
cnt[a[l]]--;
if(cnt[a[l]]==0) diff--;
l++;
}
}
cout<<ansl<<" "<<ansr;
return 0;
}