典型的滑动窗口思路:leetcode 第 76 题:最小覆盖子串(C++)_zj-CSDN博客
#include <iostream>
#include <vector>
using namespace std;
const int maxn = 1e6+10;
const int maxm = 2010;
int n, m;
int a[maxn];
int main(){
cin >> n >> m;
vector<int> need(m+1, 1), window(m+1, 0); //每种颜色的气球只需要一个就可以了,0表示没有打中
for(int i = 0; i < n; ++i) cin >> a[i];//输入示每一枪打中的气球的颜色
int l = 0, r = 0;
int target = m; //需要击中的气球数量
int len = 1e7;
while(r < n){
int val = a[r];//表示打中的气球颜色
++r;// 右移窗口
if(val != 0 && need[val]){
++window[val];
if(window[val] == need[val]) --target;//满足一个需求
}
while(target == 0){//全部气球均打中
if(r-l < len){
len = r-l;
}
int c = a[l];
++l;// 左移窗口
if(need[c] > 0){
if(need[c] == window[c])//移出去
++target;
--window[c];
}
}
}
if(len == 1e7) cout << -1;
else cout << len;
cout << endl;
return 0;
}