和数量有关的子序列,当然是滑动窗口,而且是比较简单的滑动窗口。
滑动窗口,如果某个窗口新加了r之后,如果达到了maxn,就缩减左边,缩减到window[r]不为maxn为止,每次在中间就要进行判断r-l+1和maxn谁更小,这个很重要,不是在外面判断的
class Solution {
public:
int findShortestSubArray(vector<int>& nums) {
//滑动窗口,如果某个窗口新加了r之后,如果达到了maxn,就缩减左边
unordered_map<int,int> ma;
for(int x : nums) ma[x]++;
int maxn = 0;
for(auto p : ma){
maxn = max(p.second,maxn);
}
int l = 0, r = 0;
int res = INT_MAX;
unordered_map<int,int> window;
while(r < nums.size()){
window[nums[r]]++;
//然后缩减左边
while(window[nums[r]] == maxn){
res = min(res,r-l+1);
window[nums[l]]--;
l++;
}
r++;
}
return res;
}
};