697-数组的度

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;
    }
};

   转载规则


《697-数组的度》 M 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
用栈实现队列 用栈实现队列
面试题09. 用两个栈实现队列 栈A用于加入元素 栈B用于反转元素。栈顶元素就是队头元素。删除队头时 先判断 B 是否为空,只要 B 不为空, 无论 A 是否为空都是从 B 弹出元素 B为空时 若A为空,则返回-1 若A不为空,则将其转反转
2021-09-04
下一篇 
11-盛最多水的容器 11-盛最多水的容器
11. 盛最多水的容器 利用双指针,不断更新面积 决定面积大小的因素:两个柱子(指针)之间的距离以及两柱子的最低高度。所以面积表示为min(height[l],height[r])*(r-l) 如果低柱子不动,让高柱子的那一侧往里跳,(r
2021-09-02
  目录