代码
#include <iostream>
using namespace std;
int sum[1000010];
int picture[1000010] ;
int main()
{
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i++)
{
cin >> picture[i];
}
int minl = 0, minr = 0, minNum = n+1;
int l = 0, r = 0,hadSeen=0;//l,r,记录现在的区间,hadSeen记录现在有几张画.
while (l <= r && r <= n)
{
if (hadSeen < m)
{
sum[picture[r]]++;
if (sum[picture[r]] == 1)
{
hadSeen++;
}
r++;
}
else {
if (minNum > r - l)
{
minNum = r - l;
minr = r;
minl = l;
}
//去掉最左侧的一幅画
sum[picture[l]]--;
if (sum[picture[l]] == 0)
{
hadSeen--;
}
l++;
}
}
cout << minl+1 << " " << minr ;
}
注意点
- 声明一个很大的全局变量数组可以默认初始化为0,而且不会开在栈区,会方便很多操作
- maxNum 这种最小值应该开一个尽量大的数,一定要选在不能到达的一个位置
- 边界条件检查要仔细一点,尽量别while套while会有点复杂