题目大意
给出一个只包含 到
的整数的数组
,请找出包含了
到
的四种数字且至少有
个
的最短区间,并输出最短区间的长度。数据保证至少存在一个答案。
思路
- 采用快慢指针
,并使用计数数组存储区间
中四种数字的个数。
- 当区间内四种数字的个数满足要求时,更新答案,慢指针
右移(缩小区间,寻找更优解);否则,快指针
右移(扩展区间)。
- 每次改变区间,都更新一次计数数组。
代码
注意,数字 是至少
个而不是恰好
个,
我一开始在这里写错了啊啊啊……
#include <iostream>
using namespace std;
const int N=1e5+5;
int a[N],cnt[10];
int main()
{
ios::sync_with_stdio(0);
int n,k;
cin>>n>>k;
for(int i=1;i<=n;++i) cin>>a[i];
int ans=n;
int i=1,j=0;
while(j<=n)
{
if(cnt[1]&&cnt[2]&&cnt[3]&&cnt[4]>=k)
{
ans=min(ans,j-i+1);
--cnt[a[i]];
++i; //慢指针右移
}
else
{
++j; //快指针右移
++cnt[a[j]];
}
}
cout<<ans;
return 0;
}