力扣239.滑动窗口最大值

server/2024/12/16 0:59:39/

文章目录

  • 一、前言
  • 二、单调队列

一、前言

力扣239.滑动窗口最大值

滑动窗口最大值,这道题给定一个数组,以及一个窗口的长度,这个窗口会往后滑动,直到数组最后一个元素。

要求每个滑动窗口的中的最大值。对于这道题,我刚看到的时候没有比较好的思路,心里想没思路?直接一个无脑暴力!

暴力的思路就是遍历数组的时候,每次遍历滑动窗口找出最大值!

果然,超时了。。。。。。

image-20241214155929713

遍历数组的时间复杂度是O(n),如果当滑动窗口的长度为n/2的时候,遍历滑动窗口找出最大值的时间复杂度是O(n),那么整体的暴力算法的时间复杂度是O(n²)。


二、单调队列

正所谓“空间换时间”,所以在这题中,想要降低时间复杂度,那就要牺牲一点空间,用空间来换时间。

这道题单看数组可能不是很直观,如果将数组转化为折线图,那么就能看出规则了!

假设现在有一个这样的数组,nums = [2,1,4,2,3,2], k = 3,该数组的折线图如下所示。

image-20241214161043730

[2,1,4]这个滑动窗口里面,最大值的4,但是2和1有没有可能作为滑动窗口的最大值呢?

这个是不可能的,因为4在2和1的右边,包含了1或2的滑动窗口必然包含了4,因此4会是最大值,而2和1没有机会成为最大值,于是就需要记录4。

随着滑动窗口往下往下滑动,那么滑动窗口为[1,4,2],最大值仍然为4,前面说了1是不可能有成为最大值的记录,那么这里的2有成为最大值的机会么?

很显然,是有可能的,因为2在4的右边,而且2后面的数字还不知道,有可能是比2小,并且在后面包含了2的滑动窗口中,可能不会包含4,因此2有可能成为最大值,于是需要将2记录下来。

窗口继续往下滑动,滑动窗口为[4,2,3],最大值为4,由于这次有3,3比2大,和前面一样,有3在,2不可能成为最大值,于是移除前面记录的2,而是将3进行记录。

窗口继续滑动,滑动窗口为[2,3,2],这时候4已经超出滑动窗口范围,需要在前面记录的数据中移除,于是这次滑动窗口的最大值就是3了

整体思路如上所示,这里需要用到一个数据结构——单调队列,思路如下:

  1. 入队列,将元素添加到队尾,并且需要维持队列的单调性(队列从大到小排序)
  2. 出队列,当元素超出滑动窗口的范围的时候,需要出队列
  3. 记录答案,每次滑动窗口的最大值就是队列的首部!
java">public int[] maxSlidingWindow(int[] nums, int k) {int[] res = new int[nums.length - k + 1];Deque<Integer> queue = new LinkedList<>();for (int i = 0; i < nums.length; i++) {while (!queue.isEmpty() && nums[i] > nums[queue.getLast()]){// 维持单调性queue.removeLast();}if (!queue.isEmpty() && i - queue.getFirst() >= k){queue.removeFirst();}queue.addLast(i);if (i >= k - 1){// 收集结果res[i - k + 1] = nums[queue.getFirst()];}}return res;
}

image-20241214162540951
解决!下班!!!



http://www.ppmy.cn/server/150487.html

相关文章

代码随想录 leetcode-数据结构刷题笔记

文章目录 一、数组1.1 二分查找 1.1.1 二分查找 1.1.2 搜索插入位置1.1.3 排序数组中查找元素第一和最后一个位置1.1.4 x的平方根 1.1.5 有效的完全平方数 1.2 快慢指针 1.2.1 移除元素 1.2.2 删除有序数组中的重复项 1.2.3 移动0 1.2.4 比较含退格的字符串 1.2.5 有序数组的平…

.NET6 WebAPI从基础到进阶--朝夕教育

1、环境准备 1. Visual Studio 2022 2. .NET6 平台支持 3. Internet Information Services 服务器&#xff08; IIS &#xff09; 4. Linux 服务器 【 CentOS 系统】 ( 跨平台部署使用 ) 5. Linux 服务器下的 Docker 容器&#xff08; Docker 部署使用&#xff09; …

Java毕设项目:基于Springboot校园学习资料共享平台网站系统设计与实现开题报告

博主介绍&#xff1a;黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者&#xff0c;CSDN博客专家&#xff0c;在线教育专家&#xff0c;CSDN钻石讲师&#xff1b;专注大学生毕业设计教育、辅导。 所有项目都配有从入门到精通的基础知识视频课程&#xff…

ThinkRAG开源!笔记本电脑可运行的本地知识库大模型检索增强生成系统

ThinkRAG 大模型检索增强生成系统&#xff0c;可以轻松部署在笔记本电脑上&#xff0c;实现本地知识库智能问答。 该系统基于 LlamaIndex 和 Streamlit 构建&#xff0c;针对国内用户在模型选择、文本处理等诸多领域进行了优化。 1. 项目地址 ThinkRAG 在Github开源&#xf…

深入解析 Spring Security —— 打造高效安全的权限管理体系

目录 前言1. 初识 Spring Security1.1 Spring Security 的两大核心功能1.2 Spring Security 的主要特点 2. 配置 Spring Security2.1 配置类概述2.2 基础配置示例2.3 示例解析 3. Spring Security 的进阶功能3.1 自定义用户服务3.2 注解式权限控制3.3 动态权限控制 4. 实战应用…

基于PHP课堂签到系统的设计与实现

摘 要 随着教育业的迅速发展和学生人数的不断增加&#xff0c;导致在班级登记制度中传统的“点到”方式不能适应学校的实际需要。从而需要设计一个好的课堂签到系统将会对课堂签到管理工作带来事半功倍的效果。文章着重介绍了基于实践应用的班级签到系统的开发流程&#xff0c…

分布式 窗口算法 总结

前言 相关系列 《分布式 & 目录》《分布式 & 窗口算法 & 总结》《分布式 & 窗口算法 & 问题》 参考文献 《【算法】令牌桶算法》 固定窗口算法 简介 固定窗口算法是最简单的流量控制算法。固定窗口算法的核心原理是将系统的生命周期划分为一个个…

java 动态设置 jvm

在 Java 中&#xff0c;动态设置 JVM 参数(如堆大小、垃圾回收策略等)通常在启动应用时通过命令行来设置&#xff0c;而在运行时修改 JVM 参数是比较有限的。不过&#xff0c;你仍然可以通过以下几种方式来调整 JVM 的一些设置&#xff1a; 1. 在启动时设置 JVM 参数 这些参数在…