题意:
求含有K个不同数的最长区间的左右端点(任意一组)
求含有K个不同数的最长区间的左右端点(任意一组)
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int n, a[1000010], vis[1000010], i, num = 0;
int l = 1, r = 1, k, len = 0, x, y, j;
cin>>n>>k;
memset(vis, 0, sizeof(vis));
for(i = 1; i <= n; i++)
{
cin>>a[i];
if (!vis[a[i]])
num++;//区间内不同的数的个数
vis[a[i]]++;//每个数出现的次数
if (num > k)//如果不同的数的个数大于给出的k就会进行判断
{
for(j = l; j <= r; j++)//查找当前区间内
{
vis[a[j]]--;
if (!vis[a[j]])//如果最左端的数只有一个(没有重复的),左端点l右移
{
num--;
l = j+1;//l往后移,用新加进来的代替最左端的
break;
}
}
}
r = i;//更新右端点
if (r-l+1 > len)//每次更新最长序列的左右端点
{
len = r-l+1;//区间长度
x = l;//左端点
y = r;//右端点
}
}
cout<<x<<' '<<y<<endl;
return 0;
}