代码随想录二刷 day13 | 栈与队列 之 239. 滑动窗口最大值 347.前 K 个高频元素

news2024/9/24 23:32:24

day13

      • 239. 滑动窗口最大值
      • 347.前 K 个高频元素

239. 滑动窗口最大值

题目链接
解题思路:

设计单调队列的时候,pop和push操作要保持如下规则:

  1. pop(value):如果窗口移除的元素value等于单调队列的出口元素,那么队列弹出元素,否则不用任何操作

  2. push(value):如果push的元素value大于入口元素的数值,那么就将队列入口的元素弹出,直到push元素的数值小于等于队列入口元素的数值为止

保持如上规则,每次窗口移动的时候,只要问que.front()就可以返回当前窗口的最大值。
在这里插入图片描述
代码如下:

/*
class Solution {
private:
    class MyQueue{
    public:
        deque<int> que;

        void pop(int value){
            if(!que.empty() && value == que.front()){
                que.pop_front();
            }
        }

        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 < k; i++){
            que.push(nums[i]);
        }
        result.push_back(que.front());
        for(int i = k; i < nums.size(); i++){
            que.pop(nums[i - k]);
            que.push(nums[i]);
            result.push_back(que.front());
        }
        return result;

    }
};
*/

class Solution {
private:
    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;
    }
};


347.前 K 个高频元素

题目链接
解题思路:
堆是一棵完全二叉树,树中每个结点的值都不小于(或不大于)其左右孩子的值。 如果父亲结点是大于等于左右孩子就是大顶堆,小于等于左右孩子就是小顶堆。
我们要用小顶堆,因为要统计最大前k个元素,只有小顶堆每次将最小的元素弹出,最后小顶堆里积累的才是前k个最大元素。
代码如下:

class Solution {
public:
    class mycomparison{
    public:
        bool operator()(const pair<int, int>&lhs, const pair<int, int>& rhs){
    
            return lhs.second > rhs.second;
        }
    };

    vector<int> topKFrequent(vector<int>& nums, int k) {
        
        unordered_map<int, int> map;
        for (int i = 0;i < nums.size(); i++){
            map[nums[i]]++;
        }

        priority_queue<pair<int,int>,vector<pair<int, int>>, mycomparison > pri_que;
        
        for(unordered_map<int, int>:: iterator it = map.begin();it != map.end(); it++){
            pri_que.push(*it);
            if(pri_que.size() > k){
                pri_que.pop();
            }
        }

        vector<int> result(k);
        for(int i =k - 1; i >= 0; i--){
            result[i] = pri_que.top().first;
            pri_que.pop();
        }
        return result;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/610934.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

拜登签字了

* * * 原创&#xff1a;刘教链 * * * 号外&#xff1a;今天在“刘教链Pro”发表了一篇《对PoS的链重建攻击》&#xff0c;总结了一下最近关于PoW和PoS安全性的碰撞&#xff0c;抛砖引玉&#xff0c;欢迎关注“刘教链Pro”并阅读。 * * * 隔夜比特币仍在27k上方盘旋。盘旋之中微…

数据万象 | AIGC 存储内容安全解决方案

AIGC&#xff08;人工智能生产内容&#xff09; 已经成为与PGC&#xff08;专业生产内容&#xff09;、UGC&#xff08;用户生产内容&#xff09;并驾齐驱的内容生产方式。由于 AI 的特性&#xff0c;AIGC在创意、个性化、生产效率等方面具有独特的优势&#xff0c;这些优势可以…

Hadoop中MapReduce概述

MapReduce概述 MapReduce定义MapReduce优缺点MapReduce核心思想MapReduce进程MapReduce编程规范MapTask并行度决定机制ReduceTask并行度决定机制mapreduce中job的提交流程MapReduce工作流程shuffle机制分区partition数据清洗&#xff08;ETL&#xff09;进一步分析MapTask和Red…

项目经理如何制定工作计划?做到这3点就够了

工作计划的重要性在于明确目标和实现具体步骤&#xff0c;协调大家一致行动&#xff0c;增强工作的主动性&#xff0c;减少工作的盲目性&#xff0c;让工作有条不紊地进行。同时&#xff0c;制定计划也可以对工作进度和质量有个保证和标准&#xff0c;对大家的工作有约束和督促…

Android Native crash问题分析

1、准备材料 android-ndk-r21b工具&#xff1a;addr2line和objdump工具。 .so库&#xff1a;crash对应的带符号表的共享库 源代码code&#xff1a;crash对应的源码文件 tombstone&#xff1a;Android系统产生的墓碑文件 2、 tombstone墓碑文件分析 关键信息&#xff1a; c…

前端div水平居中的几种实现方式

借助display布局 父元素开启display:flex布局,并设置justify-content:center主轴的空隙分布 因为是单行,所以使用align-items:center设置侧轴上的对其方式 <body><style>.a{width: 200px;height: 200px;background-color: red;display: flex;justify-content: c…

JS新标签页打开,让你的网站访问更加便捷

前言 大家在浏览网页时&#xff0c;常常需要在新的标签页中打开链接&#xff0c;以便在不离开当前页面的情况下查看其他内容。其中&#xff0c;JS 打开新标签页作为一种常用的功能之一&#xff0c;既可以方便用户快速访问相关链接&#xff0c;又能有效提升网站的用户体验。在本…

【Python 二进制和十六进制】零基础也能轻松掌握的学习路线与参考资料

1.了解二进制和十六进制的基本概念和用途 在计算机中&#xff0c;二进制和十六进制是两种常用的表示数据的方式。二进制只有两个数字0和1&#xff0c;表示一个比特&#xff08;bit&#xff09;&#xff0c;在实际的计算机程序中&#xff0c;常用八个比特表示一个字节&#xff…

如何在 JavaScript 中创建自定义警告框

本文将介绍如何使用 jQuery UI、SweetAlert2 和自定义警报功能在 JavaScript 中创建自定义警报框。 使用 jQuery UI 创建自定义警告框 我们可以使用 jQuery UI 来模仿 JavaScript 本机 alert() 函数的功能。 尽管 jQuery UI 有很多 API&#xff0c;您可以使用它的 dialog() AP…

Python--注释

Python--注释 <font size4, colorblue> 一、Python中注释的形式<font size4, colorblue> 1、单行注释&#xff1a;使用“#”符号注释<font size4, colorblue> 2、多行注释&#xff1a;使用一对三个英文单引号注释<font size4, colorblue> 3、多行注释&…

W3电力线载波通信技术

CK_Label_W3 CK_Label_W3&#xff08;外接供电版&#xff09; 产品型号 CK_Label_W3 尺寸 114.5*44.5*19mm 屏幕尺寸 2.9 inch 分辨率 296*128 像素密度 112dpi 显示技术 电子墨水屏显示 显示颜色 黑/白 外观颜色 白色 按键 4 指示灯 4 RGB灯 灯光颜色…

帮你梳理了一份前端知识架构图

列一份前端知识架构图 在上一篇文章中&#xff0c;我们简要地总结了前端的学习路径与方法&#xff0c;我们提到的第一个学习方法就是&#xff1a;建立知识框架。那么&#xff0c;今天我们就一起来列一份前端的知识框架图。 在开始列框架之前&#xff0c;我想先来谈谈我们的目…

GoogleTest之gMock:创建Mock

目录 MOCK_METHODmock方法的访问属性mock重载函数mock模板类mock非虚函数mock自由函数Nice/Strict/Naggymock方法简化参数mock具体类的替代方法代理给fake mock是用来模拟对象&#xff0c;隔离边界的一种测试方法&#xff0c;以便在开发阶段不需要依赖第三方或其他依赖项可以进…

C#,码海拾贝(31)——约化“对称矩阵“为“对称三对角阵“的“豪斯荷尔德Householder变换法“之C#源代码

using System; namespace Zhou.CSharp.Algorithm { /// <summary> /// 矩阵类 /// 作者&#xff1a;周长发 /// 改进&#xff1a;深度混淆 /// https://blog.csdn.net/beijinghorn /// </summary> public partial class Matrix {…

运维小白必学篇之基础篇第九集:Linux文件管理实验

Linux文件管理实验 实验作业&#xff1a; 1、筛选/etc/issue文件中的空行 2、筛选/etc/passwd文件中以“bash”结尾的行 3、筛选/etc/passwd文件中以“sync”开头的行 4、列出/etc/passwd文件中包含“dns”的行,并显示行号 5、创建a1-a3.txt3个文件&#xff0c;使用tar命令将这…

基于GD32的定时器不完全详解--定时、级联

SysTick 定时器 SysTick 是一个 24 位的倒计数定时器&#xff0c;当计到 0 时&#xff0c;将从 RELOAD 寄存器中自动重装载定时初值。只要不把它在 SysTick 控制及状态寄存器中的使能位清除&#xff0c; 就永不停息。 该定时器的介绍在MCU的手册中一般不会介绍&#xff0c;因为…

MySQL server安装记录

1 安装Notepad 运行下载的 npp.7.9.Installer.x64.exe 2 安装MySQL 将mysql-8.0.22-winx64.zip解压缩&#xff0c;我将其放置D盘根目录下。 进入文件夹&#xff0c;在目录中新建文件夹data和文件my.ini 用NotePad打开my.ini&#xff0c;输入以下内容并保存&#xff0c;其中目…

讨论和总结 树模型 的三种序列化 方式的区别(模型存储大小、序列化所用内存、序列化速度)...

一、前言 本文总结常用树模型&#xff1a; rf&#xff0c;xgboost&#xff0c;catboost和lightgbm等模型的保存和加载&#xff08;序列化和反序列化&#xff09;的多种方式&#xff0c;并对多种方式从运行内存的使用和存储大小做对比 二、模型 2.1 安装环境 pip install xgboos…

「车型分析」移动机器人控制系统典型应用车型 ——叉式移动机器人(AGV/AMR)

叉式移动机器人&#xff08;AGV/AMR&#xff09;是一种常见的移动机器人类型&#xff0c;它摆脱传统的人车操作&#xff0c;自动导航行驶&#xff0c;具有强大的柔性和智能性。叉式移动机器人&#xff08;AGV/AMR&#xff09;不同于传统叉车&#xff0c;它无需人工驾驶运行。具…

Spring纯注解开发模式让开发简化更简化

目录 一.注解开发二.注解定义Bean三.衍生注解四.纯注解开发模式五.注解实现注入 1.自动装配2.按名称注入3.简单数据注入4.读取properties配置文件六.Spring整合MyBatis 一.注解开发 以前跟老韩学习SE时他就说&#xff1a; 注解本质是一个继承了Annotation 的特殊接口,其具体…