力扣 239. 滑动窗口最大值

题目链接
chatgpt写的代码,
首先这是个滑动窗口的问题,要用单调队列来解决,这个就是毋庸置疑的,就直接接受就行了
其次,不知道单调队列是啥,知道单调队列是啥了,又不知道单调队列该如何实现,单调队列用双端队列 deque实现,又不怎么清楚deque STL的相关操作.

明白了语法上怎么实现,现在又得发愁算法上如何实现,
如何保持单调队列呢----即如何让队列内的元素一直保持递减呢?
将入队元素和队尾元素比较,如果队尾元素小了,把队尾元素踢出去。
这也就说明了,咱单调队列的元素的实际个数,不一定非得是题里给的滑动窗口个数,有可能小
然后就是滑动窗口的大小得维持,就是怎么才能跟着往前走,就是每次遍历要先检查队头的元素,**咱这个队列元素存的是索引号!**是不是比i-k大,不大的话就是不符合队列大小的要求,就得队头元素出队。

之后就是入队,那么问题来了,为什么添加当前元素到队列(元素入队)要等移除不在窗口范围内的元素的索引和保持队列单调递减之后才添加

如果从编写代码的角度上就是,遍历到了当前的元素,那就得进行检验,而不是不管不顾就直接入队,得先改变队列,确保滑动窗口的大小和队列是单调队列之后再入队,

单调队列

不知道是啥,哈哈哈哈我也不知道

单调队列和优先队列是两种特殊的队列,它们在数据结构中扮演着重要的角色,尤其是在解决特定算法问题时。尽管它们的名字中都有“队列”,但它们的设计目的、操作方式和应用场景大相径庭。下面是单调队列和优先队列的主要区别:

单调队列(Monotonic Queue)

单调队列是一种特殊的队列,其元素按照单调递增或单调递减的顺序排列。这意味着队列中的元素是有序的,要么是从队头到队尾递增,要么是递减。单调队列主要用于解决滑动窗口类型的问题,如在一个滑动窗口中寻找最大值或最小值。

  • 主要特点
    • 队列中元素单调递增或递减;
    • 用于解决滑动窗口最值问题;
    • 添加或移除元素时需要维持队列的单调性。

优先队列(Priority Queue)

优先队列是一种允许在插入过程中对元素进行排序的队列。在优先队列中,元素被赋予优先级,当访问队列时,拥有最高优先级的元素最先被移除。优先队列通常通过堆(Heap)数据结构来实现,以便高效地管理元素的优先级。

  • 主要特点
    • 元素按优先级排序,最高优先级的元素最先被移除;
    • 通常用堆(Heap)实现,以支持快速插入和删除操作;
    • 用于需要元素优先级决定处理顺序的场景,如任务调度。

主要区别

  • 目的和应用:单调队列主要用于处理滑动窗口内的最大值或最小值问题,而优先队列用于管理根据优先级排序的元素,适用于任务调度等场景。
  • 元素排序:单调队列内的元素是根据单调递增或递减的规则排序的,而优先队列的元素排序是根据元素的优先级。
  • 实现方式:单调队列可以通过双端队列(Deque)来实现,以便在两端添加或移除元素,而优先队列通常通过二叉堆等堆结构实现,以优化元素的插入和删除操作。

综上所述,尽管单调队列和优先队列都是队列的变体,但它们各自适用的场景、操作方式和实现机制有着根本的区别。选择使用哪一种队列结构取决于你面临的具体问题和需求。

#include <vector>
#include <deque>
using namespace std;class Solution {
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {vector<int> result;deque<int> window; // 存储索引,而不是元素for (int i = 0; i < nums.size(); i++) {// 移除不在窗口范围内的元素的索引while (!window.empty() && window.front() <= i - k) {window.pop_front();}// 保持队列单调递减while (!window.empty() && nums[window.back()] < nums[i]) {window.pop_back();}// 添加当前元素索引到队列window.push_back(i);// 添加窗口的最大值到结果if (i >= k - 1) {result.push_back(nums[window.front()]);}}return result;}
};

自己重新写了一遍新犯的错误

#include <vector>
#include <deque>
using namespace std;class Solution {
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {vector<int>result;deque<int>window;for(int i=0;i<nums.size();i++){while(!window.empty()&&window.front()<=i-k){window.pop_front();}while(!window.empty()&&nums[window.back()]<nums[i]){window.pop_back();}window.push_back(i);if(i>=k-1)result.push_back(nums[window.front()]);//如果只写这句话,那么就是从滑动窗口还没长到k那么大的时候就开始输出最大值了,所以必须有这个判断条件}return result;}
};

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

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

相关文章

王道机试C++第 5 章 数据结构二:队列queue和21年蓝桥杯省赛选择题Day32

目录 5.2 队列 1&#xff0e;STL-queue 课上演示&#xff1a; 基本代码展示&#xff1a; 2. 队列的应用 例:约瑟夫问题 No. 2 题目描述&#xff1a; 思路提示&#xff1a; 代码展示&#xff1a; 例&#xff1a;猫狗收容所 题目描述&#xff1a; 代码表示&#xff1…

蓝桥杯-List集合

目录 List集合实例化 List集合实例化步骤 常用方法 ArrayList方法 1&#xff1a;add(Object element) 2&#xff1a;size() 3&#xff1a;get(int index) 4&#xff1a;isEmpty() 5:contains(Object o) 6&#xff1a;remove(int index) 总结ArrayList list集合的特点…

Web服务器需要警惕的一些安全隐患

Web服务器需要警惕的一些安全隐患有哪些&#xff0c;今天德迅云安全就带您来了解下。熟悉了解了就知道怎么规避风险。不过无论是什么漏洞&#xff0c;都体现着安全是一个整体的真理&#xff0c;考虑Web服务器的安全性&#xff0c;必须要考虑到与之相配合的操作系统。 1.物理路径…

应用方案 | DCDC电源管理芯片MC34063A

DCDC电源管理芯片 MC34063A MC34063A 为一单片 DC-DC 变换集成电路&#xff0c;内含温度补偿的参考电压源&#xff08;1.25V&#xff09;、比较器、能有效限制电流及控制工作周期的振荡器&#xff0c;驱动器及大电流输出开关管等。外配少量元件&#xff0c;就能组成升压、…

Redis缓存、缓存穿透、缓存雪崩、缓存击穿

1.认识Redis缓存 先来认识一下缓存&#xff0c;再了解redis用作缓存时的作用和问题&#xff0c;以及如何解决redis缓存在的问题。 1.1.什么是缓存 1.2.缓存的优缺点(作用和成本) 2.redis缓存的作用 正常客户端请求服务器&#xff0c;服务器会直接访问数据库&#xff0c;这有…

Selenium自动化测试细节讲解

与以前瀑布式开发模式不同&#xff0c;现在软件测试人员具有使用自动化工具执行测试用例套件的优势&#xff0c;而以前&#xff0c;测试人员习惯于通过测试脚本执行来完成测试。 但自动化测试的目的不是完全摆脱手动测试&#xff0c;而是最大程度地减少手动运行的测试。自动化…

R语言系列2——R语言数据处理技巧

目录 写在开头1. 数据导入与导出1.1 基础操作详解1.1.1 导入数据1.1.2 导出数据 1.2 高级技巧详解1.2.1 自定义导入1.2.2 自定义导出 1.3 常见问题 2. 数据清洗基础2.1 缺失值处理2.1.1 删除含缺失值的行或列2.1.2 填充缺失值2.1.3 预测模型填充2.1.4 使用特定值填充 2.2 数据类…

【智能家居】东胜物联ODM定制ZigBee网关,助力能源管理解决方案商,提升市场占有率

背景 本文案例服务的客户是专业从事智能家居能源管理的解决方案商&#xff0c;其产品与服务旨在帮助用户监测、管理和优化能源消耗&#xff0c;以提高能源使用效率。 随着公司的扩张&#xff0c;为了增加市场占有率&#xff0c;他们希望找到更好的硬件服务支持&#xff0c;以…

mysql笔记:7. 索引

文章目录 索引含义和特点索引分类普通索引和唯一索引单列索引和组合索引全文索引空间索引 索引设计原则创建索引直接创建索引在已经存在的表上创建索引 删除索引 在关系数据库中&#xff0c;索引是一种可以加快数据检索速度的数据结构&#xff0c;主要用于提高数据库查询数据的…

人工智能指出数学教育问题

国内的数学教育长期以来都以其注重的计算能力而著称。从小学开始&#xff0c;学生们就接受严格的算术训练&#xff0c;九九乘法口诀表几乎成为了每个人的必修课。然而&#xff0c;尽管中国在数学方面的成绩屡获佳绩&#xff0c;但是锻炼的都是很容易被计算器或者计算机取代的能…

零基础学习JS--基础篇--使用类

JavaScript 是一个基于原型的语言——一个对象的行为取决于它自身的属性及其原型的属性。 在 JavaScript 中&#xff0c;类可以看作是已有的原型继承机制的一种抽象——所有语法都可以转换为原型继承。类本身也是不过是 JavaScript 里一种普通的值&#xff0c;它们有其自己的原…

JavaScript 技术100问?

JavaScript 是一种高级的、解释型的编程语言&#xff0c;通常用于为网页添加交互性和动态功能。作为 Web 开发中最重要的技术之一&#xff0c;JavaScript 在前端开发中扮演着重要角色。它可以直接嵌入到 HTML 中&#xff0c;并通过浏览器解释执行。JavaScript 的语法类似于 Jav…

2.Linux文件IO基础

Linux 文件 I/O&#xff08;Input/Output&#xff09;基础是 Linux 应用程序开发中的重要组成部分。在 Linux 系统中&#xff0c;文件 I/O 涉及到文件的读取和写入&#xff0c;以及文件描述符、系统调用等概念。以下是 Linux 文件 I/O 的基础知识&#xff1a; 1. 文件描述符 …

GEE Rgee——使用 eemont 和 geemap来进行Landsat 8数据的反演NDSI

简介 用 rgee 在 R 中使用 eemont 和 geemap来快速进行NDSI反演。 Landsat 8是一颗运行于太阳同步轨道上的遥感卫星,可以获取高分辨率的光学遥感数据,其中包括多光谱和热红外波段。NDSI(Normalized Difference Snow Index)是一种用于检测和分析雪被覆盖情况的指数。本文将…

算法刷题day25:多路归并

目录 引言概念一、鱼塘钓鱼二、技能升级三、序列 引言 关于这个多路并归蓝桥杯考的不是很多&#xff0c;如果要出的话&#xff0c;可能模型都会差不多&#xff0c;因为不会出太难的题&#xff0c;难题基本上都是贪心、DP之类的&#xff0c;所以好好刷题刷熟练就行了&#xff0…

ms office学习记录10:Excel㈣

自动填充时也可输入前几个值&#xff0c;选中单元格双击右下角黑色箭头进行填充 将填充样本行列粘贴至原列后要注意删除样本行列内容 排序与筛选 “数据”选项卡中的“排序”与“开始”选项卡中的“排序和筛选”实质相同 排序依据&#xff1a;数值内容和数值格式 “选项”…

最大的单入口空闲区域

最大的单入口空闲区域 问题描述输入输出代码实现 问题描述 找到最大的单入口空闲区域。 空闲区域是由连通的’O’组成的区域&#xff0c;位于边界的’O’可以是入口&#xff0c; 单入口空闲区域即有且只有一个位于边界的’O’作为入口的由连通的’O’组成的区域。 如果两个元素…

Docker使用之Docker Compose【入门篇】

Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。它允许用户通过一个单一的文件来定义多个容器&#xff0c;然后使用一个命令来启动、停止和管理这些容器。在本文中&#xff0c;我们将详细介绍如何使用Docker Compose进行多容器管理&#xff0c;并提供一个范例…

大数据开发(Spark面试真题-卷六)

大数据开发&#xff08;Spark面试真题&#xff09; 1、Spark HashPartitioner和RangePartitioner的实现&#xff1f;2、Spark DAGScheduler、TaskScheduler、SchedulerBackend实现原理&#xff1f;3、介绍下Sparkclient提交application后&#xff0c;接下来的流程&#xff1f;4…

查找C++中所有代码行数超过100的类成员函数

执行效果 python3 find_large_functions.py ./stage_test.cpp: StageTest::process has 106 lines. ./stage_test.cpp: StageTest::do_test_ has 172 lines.实现方法 在检测到函数开始的“可能”标志后&#xff08;比如返回类型和作用域运算符::&#xff09;&#xff0c;开始…