代码随想录训练营第十二天

news2024/11/25 6:59:50

专题:栈和队列

题目:滑动窗口最大值

给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回滑动窗口中的最大值。

 

 题目解析:怎么处理它?我们实现一个单调队列,(也是一个宫殿)。然后一个数组里面有很多的元素要依次进入队列,(其他地方的人想要进入这个宫殿),遍历数组元素进入单调队列中,(那些人进入宫殿),进入队列时,如果单调队列为空,或者队尾的元素大于要插入的元素,那么直接元素尾插入队列。(如果当前要进宫殿的人发现,宫殿里面没有人,或者前面有人了,但是都比自己厉害,那么它就进入宫殿要么当老大,要么很低调的,夹尾巴跟在比她厉害的人后面!)。如果队列不为空,并且队尾的元素 小于当前要插入的元素,那么就要把队尾的元素弹出,然后再比较,小于当前元素的话再弹出.....直到队列为空,自己当队首,或者遇到了比自己大的队尾元素,就插入队尾。(这个人如果发现宫殿里面有人,但是那些比自己来的早的人,都比自己弱,他就会把他们一个一个的杀掉,直到杀光自己当老大,或者遇到了一个比自己厉害的人,那么就老老实实跟在人家后面,夹着尾巴做人。)队列的出队列操作,因为我们要求窗口大小K,而且窗口会一个一个完后走。所以遍历操作的时候,我们每次都执行一次,队列弹出操作。防止队列里面排序的元素多余K个。如果当前要过去的元素(窗口的第一个元素)是最大值,那么就把它执行弹出操作,如果当前要过去的元素不是最大值,那么它在其他元素进队列的时候,已经pop 了,所以不用再次对他进程pop操作。(历史的长河在滚动,每个国王的最长的寿命是K年,K年之内 它要接受来自新人的挑战,如果还没被新来的人杀掉的话,那么他就会老死,然后被弹出。新来的人里面会出现一个王。如果现在要老死的元素不是国王,是其他人,那么其实这个人在其他人进帝国的时候,已经把它杀了,所以不用再次让他老死。)而我们用数组去记录每个K窗口里面的最大值,就是相当于我们在记录每个时期的王的姓名。

代码实现:

 

 有趣的故事:单调队列真是一种让人感到五味杂陈的数据结构,它的维护过程更是如此.....就拿此题来说,队头最大,往队尾方向单调......有机会站在队头的老大永远心狠手辣,当它从队尾杀进去的时候,如果它发现这里面没一个够自己打的,它会毫无人性地屠城,把原先队里的人头全部丢出去,转身建立起自己的政权,野心勃勃地准备开创一个新的王朝.....这时候,它的人格竟发生了一百八十度大反转,它变成了一位胸怀宽广的慈父!它热情地请那些新来的“小个子”们入住自己的王国......然而,这些小个子似乎天性都是一样的——嫉妒心强,倘若见到比自己还小的居然更早入住王国,它们会心狠手辣地找一个夜晚把它们通通干掉,好让自己享受更大的“蛋糕”;当然,遇到比自己强大的,它们也没辙,乖乖夹起尾巴做人。像这样的暗杀事件每天都在上演,虽然王国里日益笼罩上白色恐怖,但是好在没有后来者强大到足以干翻国王,江山还算能稳住。直到有一天,闯进来了一位真正厉害的角色,就像当年打江山的国王一样,手段狠辣,野心膨胀,于是又是大屠城......历史总是轮回的。

附加:个人感觉,窗口的移动可以理解为“岁月的流逝”,即便再厉害的“国王”寿元也是有限的,这个曾经“屠城”的国王一方面在其有限的“一生”中,要面对新加入的元素的挑战(push 操作),另一方面在“时间”的面前,即便他再强大也是会消失在历史的长河中(窗口的移动) 

附加:所以历代国王都被载入史册,这就是我们要寻找的。 (用数组记录每个时期的最大值)

 自己的理解:单调队列的核心,只保存有可能成为最大值的元素。新进入的元素,在它进入队列的那一瞬间,就已经把不如它的全部杀了。然后我们弹出的还是,是每次判断,当前弹出的这个元素是不是这个时期的王,如果是说明这个王的时间到了,它老死了。被弹出。如果不是这个时期的王,那么说明这个元素在插入的时候已经被处理了,现在不用再进行pop操作。

 题目二:前 K 个高频元素

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

示例 1:

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

示例 2:

  • 输入: nums = [1], k = 1
  • 输出: [1]

题目解析: 

遍历数组,使用map把每个元素的 数值信息 和 次数信息 保存进去。构建小顶堆,根据map元素<key,对应出现次数> 的第二个参数,用它插入到小顶堆里面,小顶堆里面最多保存K个元素,一大多于K个就要进行弹出。直到遍历完map,得到的小顶堆里面的元素,就是数组中出现次数最多的K个元素,但是因为小顶堆,先出来的是小元素,所以要按从后到前的顺序,出元素。

具体细节:map的使用方式 ;遍历数组,拿到数组元素充当map元素的下标map[nums[i] ]++;

 优先级队列的使用方式;priority_queue<元素类型,底层容器,比较方式>  pri_que;

我们可以用优先级队列保存各种元素,按照大根堆 和 小根堆 的方式。

赋值运算符重载的方式; 由于我们优先级队列里面使用的元素类型是map类型,所以我们需要重载比较函数。

代码实现:

 

 

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

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

相关文章

【Flink实时数仓】数据仓库项目实战 《五》流量域来源关键词粒度页面浏览各窗口汇总表 【DWS】

文章目录【Flink实时数仓】数据仓库项目实战 《五》流量域来源关键词粒度页面浏览各窗口汇总表 【DWS】1.1流量域来源关键词粒度页面浏览各窗口汇总表&#xff08;FlinkSQL&#xff09;1.1.1 主要任务1.1.2 思路分析1.1.3 图解1.1.4 代码【Flink实时数仓】数据仓库项目实战 《五…

第七章Servlet

文章目录什么是Servlet为什么需要Servlet从不同角度来看Servlet总过程Servlet之间的继承关系Servlet接口接口中方法GenericServlet抽象方法HttpServlet 抽象子类小结Servlet生命周期从Servlet接口方法开始修改Servlet创建对象的时机Servlet容器Servlet相关的保存作用域request&…

零基础如何学好Python开发?

作为一个零基础小白想学好Python开发应该先确定明确目标、做好学习Python系统规划、选择适合的开发工具、进阶提升学习规划、多练多看加深对Python程序的理解&#xff0c;想入门一门编程语言就需要不断的进行练习。 一、明确目标 很多人在学习Python之前了解很少&#xff0c;很…

ShareSDK 安装教程

一、ShareSDK简介 ShareSDK是一种社会化分享组件&#xff0c;为iOS、Android、WP8 的APP提供社会化功能&#xff0c;集成了一些常用的类库和接口&#xff0c;缩短开发者的开发时间&#xff0c;还有社会化统计分析管理后台。ShareSDK移动开发者服务平台由广州掌淘网络科技有限公…

【C++进阶之路第一卷】预编译头加快编译速度

一、前言 最近在写项目的时候&#xff0c;发现随着项目越来越大&#xff0c;编译需要的时间也越来越长&#xff0c; 然后使用了预编译头&#xff0c;时间减少了很多&#xff01; 这个谁用谁知道&#xff0c;很 Nice&#xff01; 1. 预编译头的原理 简单来说就是将一些你认…

广域网简介、PE/CE/P基本概念理解、PPP协议详细介绍、PAP/CHAP认证介绍与配置、PPPOE会话建立详细介绍并配合实验抓包理解报文交互。

3.1.0 广域网&#xff08;简介、PPP、PAP、CHAP、PPPOE&#xff09; 观前温馨提示&#xff1a; 篇幅较大&#xff0c;本章主要有以下大点&#xff0c;可通过目录与右侧导航跳转观看&#xff1a; &#xff08;1&#xff09;广域网基本概念 &#xff08;2&#xff09;PPP协议介…

【Numpy基础知识】在ndarrays上索引

在ndarrays上索引 来源&#xff1a;Numpy官网&#xff1a;https://numpy.org/doc/stable/user/basics.html 文章目录在ndarrays上索引导包【1】基本索引【2】高级索引【3】结合高级索引和基本索引【3】现场访问【4】展开迭代器索引【5】为索引数组赋值【6】处理程序中可变数量的…

Python3 环境搭建

本章节我们将向大家介绍如何在本地搭建 Python3 开发环境。 Python3 可应用于多平台包括 Windows、Linux 和 Mac OS X。 Unix (Solaris, Linux, FreeBSD, AIX, HP/UX, SunOS, IRIX, 等等。)Win 9x/NT/2000Macintosh (Intel, PPC, 68K)OS/2DOS (多个DOS版本)PalmOSNokia 移动手…

浅谈转行Python的看法,分享我的学习方法

今天跟大家聊一下转行Python的看法和经验。本人之前是做Java开发的&#xff0c;后面因为公司需要Python技术&#xff0c;就接触到了Python&#xff0c;我发现Python比Java更加容易理解&#xff0c;简洁&#xff0c;后面随着Python项目的增多干脆就转行做Python开发了。 Python…

LaTeX教程(三)——文档格式排版

文章目录1. 章节目录1.1 生成章节1.2 生成目录2. 交叉引用和脚注2.1 交叉引用2.2 脚注3. 特殊环境3.1 列表3.2 文本对齐3.3 引用环境3.4 代码环境1. 章节目录 1.1 生成章节 写文章或者论文的时候&#xff0c;章节目录可谓是必不可少的&#xff0c;下面我们来聊聊LaTeX怎么处理…

Linux——安装和使用vmtools

实验1 Linux系统初识 一、安装和使用vmtools vmware tools是虚拟机VMware Workstation自带的一款工具&#xff0c;现在介绍ubuntu linux安装VMare tools。它的作用就是使用户可以从物理主机直接往虚拟机里面拖文件。如果不安装它&#xff0c;我们是无法进行虚拟机和物理…

【火电机组、风能、储能】高比例风电电力系统储能运行及配置分析附Matlab代码

​✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法…

第十三章ThreadLocal

文章目录什么是ThreadLocal基本使用常用方法使用ThreadLocal来解决使用sychronized解决ThreadLocal与synchronized的区别运用场景_事务案例场景构建引入事务JDBC中关于事务的操作的api常规解决方案常规方案的弊端ThreadLocal解决方案ThreadLocal方案的好处ThreaLocal的内部结构…

Java堆排序和代码实现详解

堆的定义 堆是计算机科学中一类特殊的数据结构的统称&#xff0c;堆通常可以被看做是一棵完全二叉树的数组对象。 堆的特性 1.它是完全二叉树&#xff0c;除了树的最后一层结点不需要是满的&#xff0c;其它的每一层从左到右都是满的&#xff0c;如果最后一层结点不是满的&…

Hadoop(入门)

一、Hadoop概述 1.1 Hadoop是什么 1&#xff09;Hadoop是一个由Apache基金会所开发的分布式系统基础架构。 2&#xff09;主要解决&#xff0c;海量数据的存储和海量数据的分析计算问题。 3&#xff09;广义上来说&#xff0c;Hadoop通常是指一个更广泛的概念—Hadoop生态圈。…

[Vue3]自定义指令实现组件元素可拖拽移动

实现思路&#xff1a; 元素移动设计思路 1.在光标按下的时刻记录下光标的绝对位置坐标&#xff08;以视窗左上角为原点&#xff09;&#xff08;const {clientX, clientY} evt&#xff09; clientX / clientY 事件属性返回当事件被触发时光标指针相对于浏览器页面当前 body …

flutter系列之:移动端手势的具体使用

文章目录简介赋予widget可以点击的功能会动的组件可删除的组件总结简介 之前我们介绍了GestureDetector的定义和其提供的一些基本的方法&#xff0c;GestureDetector的好处就是可以把任何一个widget都赋予类似button的功能。 今天将会通过几个具体的例子来讲解一下GestureDet…

用ChatGPT写一段嵌入式代码

已剪辑自: https://mp.weixin.qq.com/s/uKkUwXx32LPkUYQK44z1lw 废话不多说&#xff0c;开整&#xff01; ChatGPT: Optimizing Language Models for Dialogue&#xff0c;即优化对话的语言模型&#xff0c;它以对话的方式进行交互。对话形式使ChatGPT能够回答后续问题&#…

性能测试---LoadRunner

目录 1.LoadRunner对比Jmeter的优势 2.LoadRunner三个组件之间的关系 3.学习VUG的使用 3.1创建性能测试脚本并进行录制 第一步:打开VUG,创建一个新的性能测试的脚本 第二步:对新建的脚本进行设置 第三步:启动WebTours服务 第四步:回到VUG中,点击录制按钮并设置录制选项…

学习编程的五个关键点!你需要get它,并运用!

总体来说&#xff0c;学习如何编程是一件较难的事情。我最近发现大学里的计算机课程和各种编程训练营错过了编程的一些重要因素&#xff0c;对新手的教学用了不太恰当的方法。于是&#xff0c;我准备分享一个成功的编程课程应该具备的五大基本支柱。 菜鸟的目标是掌握编程的基…