力扣 239. 滑动窗口最大值

一、题目描述

给你一个整数数组 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]

二、题解

自定义一个保存所有可能的最大值的降序单调队列,时间复杂度和空间复杂度均为 O ( n ) O(n) O(n)

这个单调队列的内部元素从队头到队尾依次减小,且对出队和入队有以下说明:

  • 窗口移动前,窗口最左侧的值 val 如果刚好等于队头,那么说明当前的最大值会受影响,队头需要出队,而如果 val 小于队头,那么最大值不受影响。
  • 窗口移动后,窗口最右侧的值 val 需要入队,但在入队前需要弹出队尾所有小于 val 的元素,因为由于 val 的出现,这些旧的元素永远无法成为最大值,就算现在不把它们弹出,他们也会先于更大的 val 弹出。
class Solution {
private:class MaxQueue {private:deque<int> m_queue;public:void push(int val) {while (!m_queue.empty() && val > m_queue.back()) {m_queue.pop_back();}m_queue.emplace_back(val);}void pop(int val) {if (val == m_queue.front()) {m_queue.pop_front();}}int front() {return m_queue.front();}};public:vector<int> maxSlidingWindow(vector<int> &nums, int k) {vector<int> result;MaxQueue q;for (int i = 0; i < k; i++) {q.push(nums.at(i));}result.emplace_back(q.front());for (int i = k; i < nums.size(); i++) {q.pop(nums.at(i - k));q.push(nums.at(i));result.emplace_back(q.front());}return result;}
};

在这里插入图片描述

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

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

相关文章

工程系统管理 工程项目管理系统源码 工程项目各模块及其功能点清单

工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#xff1a;实现对数据字典标签的增删改查操作 2、编码管理&#xff1a;实现对系统编码的增删改查操作 3、用户管理&#xff1a;管理和查看用户角色 4、菜单管理&#xff1a;实现对系统菜单的增删改查操…

深入理解Linux网络——本机网络IO

文章目录 一、相关实际问题二、跨机网络通信过程1&#xff09;跨机数据发送2&#xff09;跨机数据接收3&#xff09;跨机网络通信汇总 三、本机发送过程1&#xff09;网络层路由2&#xff09;网络设备子系统3&#xff09;驱动程序 四、本机接收过程五、问题解答 系列文章&#…

Canal adapter同步MySQL到ES,部分时间字段始终同步不过来

1.需要看一下包含_date字段的映射类型&#xff0c;如果是date那么就需要格式化一下&#xff0c;如果不是直接字符串存进去就行了 DATE_FORMAT(a.IN_OUT_DATE, ‘%Y-%m-%d’) as IN_OUT_DATE, sql中也需要验证包含_date字段同时es中也是date类型的&#xff0c;是否都格式化 2.还…

0基础学习VR全景平台篇 第59篇:专业版功能-跨账号复制

功能位置示意 一、本功能将用在哪里&#xff1f; 跨账号复制&#xff0c;是指将本账号中已发布的VR漫游作品一键复制给其他账号使用。 复制成功后&#xff0c;其他账号中也会生成同样的作品以及获得相关的全景、音频、图片、视频等素材。 并且原作品和复制品可以独立编辑&am…

计算机网络实验报告——Wireshark 抓包分析

1. Wireshark软件下载 这里放一个蓝奏云下载链接&#xff1a; https://wwix.lanzoue.com/iEklv11klvje 密码:4g0n 2. Wireshark软件抓包使用 将该软件安装之后&#xff0c;双击打开&#xff0c;首先选择你的过滤器方式&#xff0c;我这里电脑连的是WiFi&#xff0c;就选择了这…

前端vue入门(纯代码)30_路由的props配置

喜欢的东西太贵了&#xff0c;我一咬牙&#xff0c;狠下心决定不喜欢了&#xff01; 【28.Vue Router--路由的props配置】 props配置官网文档 props属性用法和params属性差不多&#xff0c;都是要在src/router/index.js文件中配置 // 该文件专门用于创建整个应用的路由器 i…

Java设计模式之结构型-桥接模式(UML类图+案例分析)

目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 1、支付方式 2、支付渠道 五、总结 一、基础概念 桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;其主要目的是“将抽象部分与实现部分分离&#xff0c;使它们都可以独立地…

【UT学习记录】

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 Part1&#xff1a;Mock Part2&#xff1a;PowerMock Part3:Junit 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文…

Layui动态树详解

Layui动态树详解 一、什么是动态树形&#xff1f;二、Layui动态树形基本使用三、动态加载数据4.案列1.实体类2.dao方法3.子实现类4.jsp页面 前言 在前端开发过程中&#xff0c;树形控件是比较常用的控件之一。而Layui框架中&#xff0c;也提供了基于jQuery的树形控件。除了普通…

ChatGPT带我做四轴飞行器和自平衡小车

按照ChatGPT的说法&#xff0c;这款主板的的主控MCU、无线通信、电源管理、外设接口可以共用&#xff0c;需要差异化的有电机驱动、传感器的选择、控制算法和软件、电源供电。ChatGPT说的共用部分没啥争议&#xff0c;有差异化的地方需要细想下&#xff1a;电机驱动显然应该不同…

关系型数据库中如何进行事务管理

关系型数据库中如何进行事务管理 在关系型数据库中&#xff0c;事务管理是一项非常重要的功能。它允许数据库管理员在一个或多个数据库操作中实现原子性、一致性、隔离性和持久性&#xff08;ACID&#xff09;。 事务是一组数据库操作&#xff0c;它们必须全部执行或全部回滚…

验收户外LED显示屏有哪些标准

验收户外LED显示屏时&#xff0c;可以根据以下标准进行评估&#xff1a; 亮度和对比度&#xff1a;户外LED显示屏需要具有足够的亮度&#xff0c;以应对日间和强烈阳光的照射。检查显示屏在各种光照条件下的亮度表现&#xff0c;并确保对比度良好&#xff0c;以保证画面清晰可见…