原题链接: l最长连续子序列.
题目的意思是找出一段最长的序列,使得这段序列满足不同的数不超过k个,输出序列的左端和右端编号。
我们可以利用双指针去扫描整段序列,当序列中不同的数的数量已经超过限定值的时候,就要通过移动左指针来削减序列的长度,同时右指针向右移动来遍历整段序列。当序列的长度大于之前计算出的答案时,就更新左端点和右端点的答案。
#include<iostream>
using namespace std;
const int maxn = 500000 + 5;
const int maxm = 1000000 + 5;
int w[maxn];
int cnt[maxm];
int main(void)
{
int n, k;
scanf("%d %d", &n, &k);
for (int i = 1; i <= n; i++)
{
scanf("%d", &w[i]);
}
int res = 0, l, r;
for (int i = 1, j = 1, t = 0; i <= n; i++)
{
if (cnt[w[i]] == 0)
{
t++;
}
cnt[w[i]] += 1;
while (t > k)
{
if (cnt[w[j]] == 1)
{
t--;
}
cnt[w[j]] -= 1;
j++;
}
if (i - j + 1 > res)
{
res = i - j + 1;
l = j, r = i;
}
}
printf("%d %d", l, r);
return 0;
}