c++双指针或者二分答案

“奔跑吧,兄弟” 栏目组要在全国各地挑选节目录制的地点。有来自 K(1<=K<=100)个不同地区的 N(K<=N<=20,000)个选手送来了各自的竞选材料。由于参加的选手太多,没有办法同时呈现所有材料供评委进行选择。栏目组决定选择一段连续区间内的个人参选材料,这个区间内每个地区的参选选手至少要有 1名,求满足要求的最小区间长度。c++解决
输入格式:
第一行两个整数,n和k,表示有n个选手报名,k个不同的地区。

接下来n个数不大于k的整数,每两个数之间用一个空格隔开。

输出格式:
一个整数,表示最小长度的满足区间。
样例输入:
10 5
2 1 2 4 3 3 5 5 3 5
样例输出:
6
10分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 20010, K = 110;

int n, k;
int a[N], cnt[K];

int main() {
    cin >> k >> n;
    for (int i = 1; i <= n; i++) cin >> a[i];

    int left = 1, right = 0; // 初始化指针,表示区间[left, right]中没有元素
    int res = n + 1; // 结果初始化为n+1,表示不存在满足条件的区间
    while (right < n) { // 右指针扫描到最后一个元素时结束
        right++;
        cnt[a[right]]++; // 将右端点所在地区的计数器加1
        while (left <= right && cnt[a[left]] > 1) { // 如果左端点所在地区的计数器大于1,说明该地区已经有多于1个选手参选,左指针右移
            cnt[a[left]]--;
            left++;
        }
        if (left <= right && right - left + 1 >= k) { // 如果区间满足要求,更新最小区间长度
            res = min(res, right - left + 1);
        }
    }
    cout << res << endl;

    return 0;
}

img

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^