- 题目传送口
- 题目思路:
这道题我们来用双指针(尺取法)来做
思路大概是这样的:
- 先定义两个变量L和R。
- 固定左端点L,向后挪动右端点R,直到当前区间[L, R]出现m个不同的值。
- 再挪移左端点L,如果区间[L, R]还满足包含m个不同的值,判断此区间是否优于第二步求出的区间,更新数据.如果区间[L, R]不满足包含m个不同的值,那就挪移右端点R直到满足条件,再判断此区间是否优于第二步求出的区间,更新数据。
#include <bits/stdc++.h>
using namespace std;
int n, M;
int a[1e6+5];
int h[2e3+5];
int cnt;
int l, r;
int lb, rb, sz;
int main(){
ios::sync_with_stdio(false);
cin>>.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
l=1;
for(r=1;r<=n;r++){
if(h[a[r]]==0){
cnt++;
}
h[a[r]]++;
if(cnt==m){
sz=r-l+1;
lb=l;
rb=r;
break;
}
}
for(l=2;l<=n;l++){
if(h[a[l-1]]==1)cnt--;
h[a[l-1]]--;
while(cnt<m&&r+1<=n){
r++;
if(h[a[r]]==0)cnt++;
h[a[r]]++;
}
if(cnt==m){
if(r-l+1<sz){
sz=r-l+1;
rb=r;
lb=l;
}
}
}
cout<<lb<<" "<<rb;
return 0;
}