697. 数组的度
- 先统计一次数组,得到度
- 滑动窗口的左右指针用于更新并统计信息
- 先增大右窗口,得到符合条件的窗口后,开始缩小左窗口
class Solution {
public:
int findShortestSubArray(vector<int> &nums) {
map<int, int> m, counter;
// 统计数组的度
int degree = 0;
for (auto &i:nums) {
m[i] += 1;
degree = max(degree, m[i]);
}
// 滑动窗口
int l = 0;
int r = 0;
int ans = nums.size();
while (r < nums.size()) {
counter[nums[r]] += 1; // 右指针用于统计频次,然后继续向右跳
while (counter[nums[r]] == degree) { // 当前已符合条件,开始缩小左指针
counter[nums[l]] -= 1; // 更新频次
ans = min(ans, r - l + 1); // 更新窗口的大小
l++;
}
r++;
}
return ans;
}
};