
思路
用双指针找出符合题意的区间。然后左指针右移,区间更新,若新区间不符题意,则右指针右移,直到区间符合题意。再左指针右移......循环往复,即可找出所有符合题意的区间,再找出最优区间即可。
代码
#include<iostream>
#include<vector>
#include<limits.h>
using namespace std;
int sum;//统计区间不同数字的个数
int ans = INT_MAX;
int main()
{
int n,t;
cin >> n >> t;
vector<int> a(n+5,0);//区间开大一点,后面会解释
vector<int> b(t+1,0);
int l = 1, r = 1;
//从1开始,避免处理下标0
int L = 0, R = 0;//记录双指针的位置
for (int i = 1; i <= n ;i++) cin >> a[i];
while (l <= r && r <= n + 1)//这里r <= n + 1有等于的原因会在下面“坑”里讲
{
if (sum < t)
{
r++;
b[a[r-1]]++;
//双指针一般是[l,r),所以先r++
if (b[a[r-1]] == 1) sum++;//若该数字区间内第一次出现,统计
}
//如果区间不符题意,右指针右移
else
{
if (r - l < ans)
{
ans = r - l;
R = r - 1;
L = l;
}
//记录最优区间的左右端点
b[a[l]]--;
if (b[a[l]] == 0) sum--;
//若区间不符题意,sum--,右指针移动
l++;
//左指针右移,若区间符合题意,左指针继续右移
}
}
cout << L << " " << R;
return 0;
}
坑!!!(右端点的问题)
5 5
1,2,3,4,5
如果出现这样的数据,右指针不断右移。当r=6时,循环后sum==5,r=7,然后进入下一循环,因为r=7,循环终止。所以就统计不了L,R的数据。因此执行后结果会是0,0
感谢阅读~
623

被折叠的 条评论
为什么被折叠?



