代码学习录打卡Day13

1 滑动窗口最大值

在这里插入图片描述
使用单调队列,需要一个队列,这个队列呢,放进去窗口里的元素,然后随着窗口的移动,队列也一进一出,每次移动之后,队列告诉我们里面的最大值是什么。

class MyQueue {
public:
    void pop(int value) {
    }
    void push(int value) {
    }
    int front() {
        return que.front();
    }
};

每次窗口移动的时候,调用que.pop(滑动窗口中移除元素的数值),que.push(滑动窗口添加元素的数值),然后que.front()就返回我们要的最大值。队列里的元素一定是要排序的,而且要最大值放在出队口。
但如果把窗口里的元素都放进队列里,窗口移动的时候,队列需要弹出元素。

这个队列只需要维护有可能成为窗口里最大值的元素即可,并且保证队列里的元素都是从大到小的。那么这个维护元素单调递减的队列就叫做单调队列,即单调递减或单调递增的队列。
设计单调队列的时候,pop,和push操作要保持如下规则:

pop(value):如果窗口移除的元素value等于单调队列的出口元素,那么队列弹出元素,否则不用任何操作
push(value):如果push的元素value大于入口元素的数值,那么就将队列入口的元素弹出,直到push元素的数值小于等于队列入口元素的数值为止
保持如上规则,每次窗口移动的时候,只要问que.front()就可以返回当前窗口的最大值。

class MyQueue { //单调队列(从大到小)
public:
    deque<int> que; // 使用deque来实现单调队列
    // 每次弹出的时候,比较当前要弹出的数值是否等于队列出口元素的数值,如果相等则弹出。
    // 同时pop之前判断队列当前是否为空。
    void pop(int value) {
        if (!que.empty() && value == que.front()) {
            que.pop_front();
        }
    }
    // 如果push的数值大于入口元素的数值,那么就将队列后端的数值弹出,直到push的数值小于等于队列入口元素的数值为止。
    // 这样就保持了队列里的数值是单调从大到小的了。
    void push(int value) {
        while (!que.empty() && value > que.back()) {
            que.pop_back();
        }
        que.push_back(value);

    }
    // 查询当前队列里的最大值 直接返回队列前端也就是front就可以了。
    int front() {
        return que.front();
    }
};
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        MyQueue que;
        vector<int> result;
        for (int i = 0; i < k; i++) { // 先将前k的元素放进队列
            que.push(nums[i]);
        }
        result.push_back(que.front()); // result 记录前k的元素的最大值
        for (int i = k; i < nums.size(); i++) {
            que.pop(nums[i - k]); // 滑动窗口移除最前面元素
            que.push(nums[i]); // 滑动窗口前加入最后面的元素
            result.push_back(que.front()); // 记录对应的最大值
        }
        return result;
    }
};

2 前k个高频元素

给定一个非空的整数数组,返回其中出现频率前 k 高的元素。

示例 1:

输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2:

输入: nums = [1], k = 1 输出: [1] 提示:

你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。 你的算法的时间复杂度必须优于 O ( n log ⁡ n ) O(n \log n) O(nlogn)
, n 是数组的大小。 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。 你可以按任意顺序返回答案

小顶堆 五一旅游去了 就自己理解 后面补好笔记

相关推荐

  1. 代码随想Day6

    2024-04-30 07:56:03       18 阅读
  2. day13

    2024-04-30 07:56:03       41 阅读
  3. mysql学习day17

    2024-04-30 07:56:03       33 阅读
  4. mysql学习day19

    2024-04-30 07:56:03       30 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-30 07:56:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-30 07:56:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-30 07:56:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-30 07:56:03       20 阅读

热门阅读

  1. WebRTC中获取当前采集设备的deviceId

    2024-04-30 07:56:03       11 阅读
  2. 【ARM Cache 系列文章 12 – Cache Tag与 物理地址】

    2024-04-30 07:56:03       9 阅读
  3. js ajax初次跨域请求

    2024-04-30 07:56:03       12 阅读
  4. Doris 日志分析案例

    2024-04-30 07:56:03       10 阅读
  5. iOS获取通讯录的方法

    2024-04-30 07:56:03       11 阅读
  6. CSS进阶

    CSS进阶

    2024-04-30 07:56:03      13 阅读
  7. GaussianTalker 学习笔记

    2024-04-30 07:56:03       14 阅读
  8. docker学习笔记1:什么是docker

    2024-04-30 07:56:03       11 阅读
  9. Android 学习 鸿蒙HarmonyOS 4.0 第六章(TS中的函数)

    2024-04-30 07:56:03       14 阅读
  10. 如何实现瀑布流排列方式

    2024-04-30 07:56:03       19 阅读