滑动窗口最大值(leetcode hot100)

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

返回 滑动窗口中的最大值 

示例 1:

输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
输出:[3,3,5,5,6,7]
解释:
滑动窗口的位置                最大值
---------------               -----
[1  3  -1] -3  5  3  6  7       31 [3  -1  -3] 5  3  6  7       31  3 [-1  -3  5] 3  6  7       51  3  -1 [-3  5  3] 6  7       51  3  -1  -3 [5  3  6] 7       61  3  -1  -3  5 [3  6  7]      7

示例 2:

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

 

有两种思路,第一种最容易想到的,我们可以想到一种非常合适的数据结构,那就是优先队列(堆),其中的大根堆可以帮助我们实时维护一系列元素中的最大值。(代码注释写的非常详细)

 

class Solution {
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {vector<int> res; // 存储滑动窗口的最大值priority_queue<pair<int,int>> pp; // 优先队列,存储元素值和对应的索引// 初始化优先队列,将前 k 个元素加入队列for(int i = 0; i < k; i++)pp.emplace(nums[i], i); // 将元素值和索引对加入队列res.push_back(pp.top().first); // 将滑动窗口的最大值加入结果数组// 从第 k 个元素开始遍历for(int i = k; i < nums.size(); i++){pp.emplace(nums[i], i); // 将新元素加入队列// 移除滑动窗口外的元素while(pp.top().second <= i - k) pp.pop(); // 弹出队列头部小于等于 i - k 的元素res.push_back(pp.top().first); // 将当前滑动窗口的最大值加入结果数组}return res; // 返回滑动窗口的最大值数组}
};

第二种写法,更加高级,单调栈,双端队列不熟悉的先复习一下。

单调队列套路(代码注释写的非常详细)

  • 入(元素进入队尾,同时维护队列单调性)
  • 出(元素离开队首)
  • 记录/维护答案(根据队首)

class Solution {
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {vector<int> ans;deque<int> q; // 双端队列for (int i = 0; i < nums.size(); i++) {// 1. 入while (!q.empty() && nums[q.back()] <= nums[i]) {q.pop_back(); // 维护 q 的单调性}q.push_back(i); // 入队// 2. 出if (i - q.front() >= k) { // 队首已经离开窗口了q.pop_front();}// 3. 记录答案if (i >= k - 1) {// 由于队首到队尾单调递减,所以窗口最大值就是队首ans.push_back(nums[q.front()]);}}return ans;}
};

 

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

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

相关文章

2024年初中生古诗文大会备考:多选题真题和独家解析(持续更新)

今天我们继续来做初中古诗文大会的一道难题&#xff1a;多选题&#xff0c;让大家了解初中生古诗文大会的考察内容和形式&#xff0c;并且提供了我独家的题目解析和答案&#xff0c;供初中的同学们学习和参考。 Tips&#xff1a;古诗文大会的许多题目都来自于中考、高考&#…

使用Barrier共享鼠标键盘,通过macos控制ubuntu系统

之前文章写过如何使用barrrier通过windows系统控制ubuntu系统&#xff0c;该文章将详细介绍如何使用barrier通过macos系统控制ubuntu系统 一、macOS安装barrier macOS版本barrier链接 1、双击点开安装包 2、将安装包里的barrier拷贝到macOS的达达->应用程序中 3、在达达…

(黑马出品_高级篇_03)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

&#xff08;黑马出品_高级篇_03&#xff09;SpringCloudRabbitMQDockerRedis搜索分布式 微服务技术——多级缓存 今日目标1.什么是多级缓存2.JVM进程缓存2.1.导入案例2.1.1.安装MySQL2.1.1.1.准备目录2.1.1.2.运行命令2.1.1.3.修改配置 2.1.1.4.…

【Docker】PostgreSQL 容器化部署

PostgreSQL标准软件基于Bitnami PostgreSQL 构建。当前版本为16.1.0 你可以通过轻云UC部署工具直接安装部署&#xff0c;也可以手动按如下文档操作&#xff0c;该项目已经全面开源&#xff0c;可以从如下环境获取 配置文件地址: https://gitee.com/qingplus/qingcloud-platfor…

边框检测在 Python 中的应用

在游戏开发中&#xff0c;我们经常会回使用到边框检测。我们知道&#xff0c;边框检测是计算机视觉中常用的技术&#xff0c;用于检测图像中的边界和轮廓。在Python中&#xff0c;可以使用OpenCV库来实现边框检测。具体是怎么实现的&#xff1f;以下是一个简单的示例代码&#…

深入探索Java中的MarkWord与锁优化机制——无锁、偏向锁、自旋锁、重量级锁

引言 在Java并发编程领域&#xff0c;有效管理对共享资源的访问显得尤为关键。为了保障线程安全&#xff0c;Java虚拟机&#xff08;JVM&#xff09;引入了一系列精妙的锁机制&#xff0c;这其中的核心概念就是Java对象头中的MarkWord。本文将详尽解析MarkWord的作用&#xff…

Vue.js+SpringBoot开发考研专业课程管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 考研高校模块2.3 高校教师管理模块2.4 考研专业模块2.5 考研政策模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 考研高校表3.2.2 高校教师表3.2.3 考研专业表3.2.4 考研政策表 四、系统展示五、核…

国家网安教育技术产业融合发展试验区建设专家指导组莅临麒麟信安调研

3月12日下午&#xff0c;由教育部网络安全教学指导委员会秘书长&#xff08;专家组组长&#xff09;封化民、工业和信息化部规划司原司长肖华、中国现代国际关系研究院原副院长张力等领导组成的国家网安教育技术产业融合发展试验区建设专家指导组莅临麒麟信安及湖南欧拉生态创新…

【Python】成功解决NameError: name ‘cv2‘ is not defined

【Python】成功解决NameError: name ‘cv2’ is not defined &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您…

Quartz项目实际使用

目录 Quartz概念1.任务 Job2.触发器 Trigger 3.调度器 Scheduler实操总结 Quartz quartz 是一款开源且丰富特性的任务调度库&#xff0c;能够集成与任何的java 应用&#xff0c;下到独立应用&#xff0c;大到电子商业系统。quartz就是基于java实现的任务调度框架&#xff0c;用…

mac nginx安装、启动、简单命令

一. brew 安装 打开mac终端&#xff0c;输入以下命令 ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"安装完成&#xff0c;路径信息&#xff1a; 安装路径&#xff1a;/usr/local/Cellar/nginx/1.17.0 配置文件路径&…

mavon-editor实现支持md格式输入并自定义工具栏

需求说明 起源于我在做机器人报警推送的一个模块时&#xff0c;涉及到可以自定义报警的内容&#xff0c;其中内容支持md格式&#xff0c;同时还支持用户在指定光标处插入指定的字符串占位符。于是我在项目中引入mavon-editor库(支持Vue2、Vue3)&#xff0c;以支持用户输入md格…

python 写入文件的中文乱码了怎么处理

如果在写入JSON文件时遇到中文乱码问题&#xff0c;你可以在使用json.dump()函数时设置ensure_ascii参数为False&#xff0c;以保留非ASCII字符的原始形式。这样可以确保中文字符正确地写入JSON文件。 以下是一个示例&#xff1a; import jsondata {"name": "…

Maven深入了解

Maven深入了解 前言一、Maven的核心概念1.1 Maven-Jar包模块化管理1.2 POM1.3 坐标及其命名规范1.4 仓库的概念1.5 生命周期1.6 插件和目标 二、依赖管理2.1 自己写的模块和模块之间也可以互相依赖2.2 依赖的生效范围(scope标签)2.3 依赖的传递性2.4 依赖冲突问题2.5 依赖的排除…

IBatis与MyBatis区别

在sqlMap里面&#xff0c;iBatis的传入参数是parameterClass&#xff0c;而MyBatis是可以不写的&#xff0c;也可以用parameterType&#xff0c;iBatis的传出参数是resultClass。 iBatis&#xff1a; <select id"selectDeviceByWhere" parameterClass"Map&q…

Linux——多线程

目录 线程概念 线程控制 线程创建 进程 vs 线程 线程异常 线程等待 线程终止 pthread_cancel 进程替换 线程分离 线程互斥 mutex mutex接口 mutex的理解 互斥锁的实现 可重入和线程安全 死锁 什么是死锁 死锁产生的必要条件 避免死锁 线程同步 概念 条件…

ARM 汇编指令:(六) B 跳转指令

目录 一.B 和 BL 1.B/BL指令的语法格式 2.示例解析 一.B 和 BL 跳转指令 B 使程序跳转到指定的地址执行程序。指令 BL 将下一条指令的地址复制到 R14&#xff08;即返回地址连接寄存器 LR&#xff09;寄存器中&#xff0c;然后跳转到指定地址运行程序。 1.B/B…

FMEA-MSR的本质是什么?——FMEA软件

免费试用FMEA软件-免费版-SunFMEA ​FMEA-MSR&#xff08;Failure Modes and Effects Analysis - Manufacturing and Service Reliability&#xff09;是一种预防性的质量工具&#xff0c;用于识别、评估和解决产品或服务在制造和服务过程中可能出现的故障模式。其核心目的是在…

学习数据库和服务器管理技能是一个需要系统学习和实践的过程

在线课程和教程&#xff1a; 在线教育平台如 Coursera、edX、Udemy 等提供了许多数据库和服务器管理的课程&#xff0c;您可以选择适合自己水平和兴趣的课程进行学习。 自学教材&#xff1a; 可以购买经典的数据库和服务器管理书籍&#xff0c;如《数据库系统概念》、《MySQL 必…

一个悄然崛起的AI开源项目!

众所周知&#xff0c;最近这半年AI相关的话题实在是火到出圈。尤其是生成式AI的流行&#xff0c;让我们普通人也可以近距离地接触和应用AI。这其中最典型的就是ChatGPT。 那除了ChatGPT&#xff0c;还有一个非常实用的领域&#xff0c;也是我们今天要讨论的话题&#xff0c;那…