注意到满足要求的区间具有单调性,于是想到用滑动窗口。
区间具有单调性,即若[L,R]满足条件, [L,R+1]必满足条件,并且[R+1,L]有可能满足条件。如此一来不用O(n^2)枚举左右端点,这样去掉了许多根本不用考虑的情况
#include<bits/stdc++.h>
#define FAST ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define INF 0x3f3f3f3f
typedef long long ll;
const int maxn = 1e6+5;
using namespace std;
int n,m,ans_l,ans_r;
int a[maxn];
map<int,int> mp;
int main()
{
FAST;
mp.clear();
cin>>n>>m;
for (int i=1; i<=n; i++) cin>>a[i];
int l=1,r=1;
int ans=INF;
int cnt=1;
mp[a[1]]++;
while(l<=r && r<=n)
{
while(cnt<m && r<=n)
{
r++;
mp[a[r]]++;
if (mp[a[r]]==1) cnt++;
}
if (r==n+1) break; //无解的情况
if (r-l+1<ans)
{
ans_l=l;
ans_r=r;
ans=r-l+1;
}
if (mp[a[l]]==1) cnt--;
mp[a[l]]--;
l++;
}
cout<<ans_l<<' '<<ans_r<<endl;
return 0;
}