LeetCode.239滑动窗口最大值问题详解

问题描述

给定一个整数数组 nums 和一个整数 kk 代表滑动窗口的大小,该窗口从数组的最左侧滑动到最右侧。你只能在滑动窗口内看到 k 个数字,每次窗口向右移动一位。要求返回每个滑动窗口中的最大值。

示例

考虑数组 nums = [1,3,-1,-3,5,3,6,7]k = 3。根据题意,我们需要输出每个窗口的最大值,即 [3,3,5,5,6,7]

解题思路1

直观的解法是对每个窗口使用线性搜索来找到最大值,这种方法的时间复杂度是 O(n*k),其中 n 是数组长度。对于大数组和大窗口尺寸,这将非常低效。为了优化这个过程,我们可以使用双端队列(deque),这是一种允许在两端快速插入和删除的数据结构。

使用双端队列

关键思想:使用双端队列来存储每个窗口的潜在最大值的索引。队列的特点是保持从前到后的元素对应的数组值是递减的。这样,队列的头部总是当前窗口的最大值。

  1. 初始化:创建一个空的双端队列和一个结果数组。
  2. 遍历数组
    • 对于每个元素,检查队列头部的索引是否已经超出窗口范围。如果是,从队列前端移除。
    • 移除队列中所有小于当前元素的值的索引,因为它们不可能是当前或未来窗口的最大值。
    • 将当前元素的索引添加到队列后端。
    • 一旦窗口形成(即遍历到的索引大于等于 k-1),队列的头部就是该窗口的最大值,将其添加到结果数组中。
复杂度分析
  • 时间复杂度:O(n),每个元素最多被加入和删除一次。
  • 空间复杂度:O(k),双端队列在最坏的情况下存储 k 个元素的索引。

代码实现

#include <vector>
#include <deque>
#include <iostream>using namespace std;vector<int> maxSlidingWindow(vector<int>& nums, int k) {deque<int> dq;vector<int> result;for (int i = 0; i < nums.size(); i++) {if (!dq.empty() && dq.front() < i - k + 1) {dq.pop_front();}while (!dq.empty() && nums[dq.back()] <= nums[i]) {dq.pop_back();}dq.push_back(i);if (i >= k - 1) {result.push_back(nums[dq.front()]);}}return result;
}int main() {vector<int> nums = {1, 3, -1, -3, 5, 3, 6, 7};int k = 3;vector<int> result = maxSlidingWindow(nums, k);for (int num : result) {cout << num << " ";}cout << endl;return 0;
}

解题思路2

分块 + 预处理算法思路

此方法将输入数组划分为长度为 k 的多个块,并为每个块预计算两个关键的数组:

  1. 从左至右的最大值数组left):left[j] 存储从块的开始到索引 j 的最大值。
  2. 从右至左的最大值数组right):right[j] 存储从块的结束到索引 j 的最大值。

通过这两个数组,我们可以快速回答任何跨度为 k 的窗口最大值查询。具体做法是:

  • 对于一个从索引 ii+k-1 的窗口,可以分为两部分:一部分完全在一个块内,另一部分可能跨越两个块。
  • 通过比较 right[i]left[i+k-1] 的值,我们可以得到窗口的最大值,因为 right[i] 给出从窗口开始到块结束的最大值,而 left[i+k-1] 给出从块开始到窗口结束的最大值。

复杂度分析

  • 时间复杂度:预处理阶段为 O(n),每次查询的复杂度为 O(1),因此总体上非常高效,尤其适合于大量的窗口查询。
  • 空间复杂度:O(n),因为我们存储了额外的两个数组。

代码实现

#include <vector>
#include <iostream>using namespace std;vector<int> maxSlidingWindow(vector<int>& nums, int k) {int n = nums.size();vector<int> max_left(n), max_right(n);max_left[0] = nums[0];max_right[n - 1] = nums[n - 1];for (int i = 1; i < n; i++) {max_left[i] = (i % k == 0) ? nums[i] : max(max_left[i - 1], nums[i]);int j = n - i - 1;max_right[j] = (j % k == 0) ? nums[j] : max(max_right[j + 1], nums[j]);}vector<int> result;for (int i = 0; i <= n - k; i++) {result.push_back(max(max_right[i], max_left[i + k - 1]));}return result;
}int main() {vector<int> nums = {1, 3, -1, -3, 5, 3, 6, 7};int k = 3;vector<int> result = maxSlidingWindow(nums, k);for (int num : result) {cout << num << " ";}cout << endl;return 0;
}

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

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

相关文章

共93本!全网最全Frontiers旗下期刊2022、2023版影响因子和分区对比完整版目录!

本周投稿推荐 SSCI • 1区&#xff0c;4.0-5.0&#xff08;无需返修&#xff0c;提交可录&#xff09; EI • 各领域沾边均可&#xff08;2天录用&#xff09; CNKI • 7天录用-检索&#xff08;急录友好&#xff09; SCI&EI • 4区生物医学类&#xff0c;0.1-0.5&…

Gotchiverse Alchemica 代币现已在Base上线

​ 朋友们大家好&#xff0c; 继 GHST 成功登陆 Base 之后&#xff0c;我们很高兴地宣布&#xff0c;Gotchiverse的 "Gotchus Alchemica " token 也将登陆 Base&#xff01; 从今天起&#xff0c;你就可以通过我们由 Socket 协议提供的新链抽象技术&#xff0c;将 Al…

# 消息中间件 RocketMQ 高级功能和源码分析(十一)

消息中间件 RocketMQ 高级功能和源码分析&#xff08;十一&#xff09; 一、消息中间件 RocketMQ 源码分析&#xff1a; 拉取消息长轮询机制 1、消息拉取长轮询机制分析 RocketMQ 未真正实现消息推模式&#xff0c;而是消费者主动向消息服务器拉取消息&#xff0c;RocketMQ …

毕业季带给我的五个启示

每到毕业季&#xff0c;校园里总是充满了复杂的情绪。有人欢笑&#xff0c;有人落泪。同样的四年大学生活&#xff0c;为何结局如此不同&#xff1f;本文将从多个角度探讨如何实现综合改变&#xff0c;解释在交友、机会和心态上的关键因素&#xff0c;揭示“慢就是快”的真理。…

go语言day2

使用cmd 中的 go install &#xff1b; go build 命令出现 go cannot find main module 错误怎么解决&#xff1f; go学习-问题记录(开发环境)go: cannot find main module&#xff1b; see ‘go help modules‘_go: no flags specified (see go help mod edit)-CSDN博客 在本…

MinIO 网络与覆盖网络

云计算和容器化技术的发展改变了应用程序的开发、部署和管理方式。这种转变给网络环境带来了重大变化&#xff0c;为DevOps和SRE工程师带来了新的挑战和机遇。然而&#xff0c;在这种转变中&#xff0c;出现了明显的知识差距&#xff0c;特别是在理解物理网络和硬件背景下网络的…

【自动驾驶】ROS小车系统

文章目录 小车组成轮式运动底盘的组成轮式运动底盘的分类轮式机器人的控制方式感知传感器ROS决策主控ROS介绍ROS的坐标系ROS的单位机器人电气连接变压模块运动底盘的电气连接ROS主控与传感器的电气连接ROS主控和STM32控制器两种控制器的功能运动底盘基本组成电池电机控制器与驱…

Vulnhub--OS-HACKNOS-2.1

渗透复现 目标站点为wordpress&#xff0c;通过wpscan进行漏洞扫描发现漏洞插件 通过漏洞插件存在的目录穿越漏洞成功读取/etc/passwd文件中flag用户的密码 SSH登录flag用户后在备份文件中找到rohit用户的密码 切换rohit用户&#xff0c;rohit用户能够以root权限执行任何文…

mysql自动填写当前时间,添加索引

mysql自动填写当前时间 在navicat操作界面创建表时&#xff0c;如果需要自动填写时间&#xff0c;可以操作如下 CURRENT_TIMESTAMP为表添加索引 ALTER table tableName ADD INDEX indexName(columnName)追加外键 ALTER TABLE tb_commentPhoto ADD CONSTRAINT FK_comment_ph…

Redis源码学习:高性能Hash表的设计与实现

哈希表&#xff08;Hash&#xff09;是Redis数据库的数据类型之一&#xff0c;理解哈希表的实现对于掌握Redis非常重要。这篇文章&#xff0c;从哈希冲突和哈希扩展这两个角度&#xff0c;来一步步讲解Redis哈希表的工作原理。 什么是哈希表&#xff1f; 哈希表是一种通过哈希…

DM8的列存储HUGE表

DM8的列存储HUGE表 在达梦数据库&#xff08;DM8&#xff09;中&#xff0c;列存储&#xff08;Columnar Storage&#xff09;是一种用于优化大数据分析性能的存储模式&#xff0c;通过将数据按列存储而不是按行存储&#xff0c;能够显著提高查询性能&#xff0c;特别是涉及大…

Linux-目录和文件

目录 一、Linux目录 1、Linux常见目录 2、常见的Linux文件类型 二、cat-查看文件命令 1、cat命令用法 三、分页查看文件内容 1、 more命令 ​2、less命令 ​3、more和less的区别 四、查看文件开头或末尾 1、head命令 2、tail命令 3、wc-统计文件内容 4、grep 命令…

多功能投票系统(ThinkPHP+FastAdmin+Uniapp)

让决策更高效&#xff0c;更民主&#x1f31f; ​基于ThinkPHPFastAdminUniapp开发的多功能系统&#xff0c;支持图文投票、自定义选手报名内容、自定义主题色、礼物功能(高级授权)、弹幕功能(高级授权)、会员发布、支持数据库私有化部署&#xff0c;Uniapp提供全部无加密源码…

工业web4.0UI风格令人惊艳

工业web4.0UI风格令人惊艳

ARM阻击高通:AI PC大战与芯片之争

引言 在AI PC领域&#xff0c;高通的X Elite芯片因为其高性能和低功耗&#xff0c;一度被认为是未来的主导者。然而&#xff0c;ARM公司却通过法律手段试图阻止高通的独大&#xff0c;这不仅可能拖慢AI PC的发展进程&#xff0c;还引发了业界的广泛关注。本文将深入探讨ARM和高…

基于gunicorn+flash+docker模型高并发部署教程

基于gunicorn、Flask和Docker模型的高并发部署是一个复杂的过程&#xff0c;但通过这种组合可以构建出高效、可扩展的Web应用。下面是一个简化的高并发部署教程&#xff0c;供您参考&#xff1a; 一、环境准备 安装Docker&#xff1a;首先&#xff0c;确保您的服务器上安装了…

今日头条屏幕适配深度剖析

基本概念 首先几个基本概念解释&#xff1a; ● dpi&#xff1a;该值代表的是一英寸上有多少个像素点&#xff0c;常见取值为120&#xff0c;160&#xff0c;240。一般这个值才叫做密度 在android里面获取的方法为 metrics.densityDpi; 屏幕尺寸/分辨率得出DPI&#xff0c;一个…

MySQL进阶——视图

目录 1基本语法 1.1创建 1.2 查询 1.3 修改 1.4 删除 2 检查选项 2.1 级联CASCADED 2.2本地LOCAL 3 更新及作用 3.1视图的更新条件 3.2视图的作用 4视图案例 1基本语法 视图&#xff08;View&#xff09;是一种虚拟存在的表。视图中的数据并不在数据库中实际存在&…

Github 2024-06-19 C开源项目日报 Top9

根据Github Trendings的统计,今日(2024-06-19统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量C项目9C++项目1Netdata: 开源实时监控平台 创建周期:4020 天开发语言:C协议类型:GNU General Public License v3.0Star数量:68982 个Fork数量…

乾元通渠道商中标金昌市自然灾害应急能力提升项目

近日&#xff0c;乾元通渠道商中标甘肃省金昌市自然灾害应急能力提升项目&#xff0c;乾元通作为设备厂家&#xff0c;为项目提供通信指挥类装备&#xff08;多链路聚合设备&#xff09; QYT-X1 。 随着万亿国债项目的全面铺开&#xff0c; 青岛乾元通数码科技有限公司 作为国家…