题意:
给出n个数 找出一段最长的区间且里边不同的数少于K个
思路:
尺取法 num[i]表示数字i出现的次数,if当前的数没出现过,则sum++ ,num[a[i]]++, if(sum>k) 则将l 向前移,知道l--r 之间只有少于k 个不同的数 ,并更新 区间长度
#include<bits/stdc++.h>
using namespace std;
const int maxn = 5*100010;
int a[maxn];
int num[1000*1000+10];
int main()
{
int n,k;
scanf("%d%d",&n,&k);
for(int i = 1; i<=n; i++)
scanf("%d",&a[i]);
int l ,r;
l = 1;
r = 0;
int ansl = 1;
int ansr = k;
int sum= 0;
while(r<n)
{
r++;
if(num[a[r]]==0)sum++;
num[a[r]]++;
while(sum>k)
{
num[a[l]]--;
if(num[a[l]]==0)
sum--;
l++;
}
if(r-l>ansr -ansl)
{
ansr = r;
ansl =l;
}
}
printf("%d %d\n",ansl,ansr);
}