首页 > 其他分享 >LeetCode刷题记录.Day28

LeetCode刷题记录.Day28

时间:2022-11-28 22:35:45浏览次数:72  
标签:Day28 队列 value front que 数值 push LeetCode 刷题

滑动窗口最大值

class Solution {
private:
    class MyQueue{
        public:
            deque<int> que; // 使用双端队列deque来实现单调队列
            void pop(int value){
                // 每次弹出的时候,比较当前要弹出的数值是否等于队列出口元素的数值,如果相等则弹出。左端弹出
                if (!que.empty() && value == que.front()) {
                    que.pop_front();
                }
            }

            // 入队操作,如果push的数值大于入口元素的数值,那么就将队列右端端的数值弹出,直到push的数值小于等于队列入口元素的数值为止。循环弹出所有小于push值的值
            // 这样,每次操作都把比value小的全部弹出,就保持了队列里的数值是单调从大到小的了。
            void push(int value) {
                while (!que.empty() && value > que.back()) {
                    que.pop_back();
                }
                que.push_back(value);

            }

            int front() {
                return que.front();
            }
    };
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        MyQueue que;
        vector<int> result;
        for(int i = 0; i < nums.size(); i++){
            que.push(nums[i]);
            if(i == k - 1) {
                result.push_back(que.front()); // 记录对应的最大值
            }
            if(i >= k ){
                que.pop(nums[i - k]);
                result.push_back(que.front()); // 记录对应的最大值
            }
        }
        return result;
    }
};

主要难点在于自己构造一个单调递增队列,省去排序的麻烦

其实思路就是维护这个滑动窗口的时候只关注入队的时候的情况,入队的时候是最大值,那就清空队列,入队的时候不是最大值,那就把比他小的值清空。这样的话,队首总是最大值了

标签:Day28,队列,value,front,que,数值,push,LeetCode,刷题
From: https://www.cnblogs.com/tianmaster/p/16933875.html

相关文章

  • 力扣 leetcode 813. 最大平均值和的分组
    问题描述给定数组nums和一个整数k。我们将给定的数组nums分成最多k个相邻的非空子数组。分数由每个子数组内的平均值的总和构成。注意我们必须使用nums数......
  • 【算法训练营day18】LeetCode513. 找树左下角的值 LeetCode112. 路径总和 LeetCode113
    LeetCode513.找树左下角的值题目链接:513.找树左下角的值初次尝试后序递归法,传递一个容器保存当前节点的高度和当前节点为根的树左下角的值,递归单层逻辑是如果左子树节......
  • LeetCode347. Top K Frequent Elements
    题意给一个序列,输出其前K个出现频次的数字方法优先队列代码classSolution{public:structnode{intval;//值intcnt;//出现次数......
  • 长度最小子数组-LeetCode209 滑动窗口
    力扣:https://leetcode.cn/problems/minimum-size-subarray-sum/题目  给定一个含有 n 个正整数的数组和一个正整数target。找出该数组中满足其和≥target的长......
  • leetcode 10 - Regular Expression Matching - hard
    Givenaninputstring s andapattern p,implementregularexpressionmatchingwithsupportfor '.' and '*' where:'.' Matchesanysinglecharacter.​......
  • 刷题03
    增强for循环写起来比较方便,for(变量类型变量名称:数组名称)增强for循环也不用在定义数组值变量类型,在写循环的时候已经定义了。每一个数字都遍历一次,再排除出现相等的数字,就......
  • LeetCode刷题记录.Day27
    逆波兰表达式求值classSolution{public:intevalRPN(vector<string>&tokens){stack<longlong>st;for(inti=0;i<tokens.size();i++){......
  • c/c++刷题中的输入输出
    c/c++中的输入输出#include<iostream>usingnamespacestd;intmain(){//c语言中的输入输出inta,b;scanf("%d%d",&a,&b);printf("%d\n",a+b);......
  • #yyds干货盘点# LeetCode程序员面试金典:判定字符是否唯一
    题目:实现一个算法,确定一个字符串s的所有字符是否全都不同。示例1:输入:s="leetcode"输出:false示例2:输入:s="abc"输出:true代码实现:classSolution{public......
  • leetcode 56. 合并区间 js实现
    以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i]=[starti,endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入......