滑动窗口最大值

devtools/2024/11/9 17:07:45/

题目描述

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

返回滑动窗口中的最大值。

问题分析

需要在一个大小为 k 的滑动窗口内找到当前窗口内的最大值。滑动窗口从数组的最左侧开始,每次向右移动一位。最简单的方式是对于每个窗口都遍历其内部元素找出最大值,但这种方法的时间复杂度较高

优化思路

可以利用双端队列(Deque)来优化这个过程,使得在每次移动滑动窗口时都能在 O(1) 的时间复杂度内得到当前窗口的最大值。

具体步骤

1、我们维护一个双端队列 deque,其中存储数组元素的索引,并且保证队列中存储的索引对应的数组值是单调递减的。这样,队列的第一个元素总是当前窗口的最大值的索引。
2、在滑动窗口向右移动一位时,首先检查队列的头部元素是否已经不在当前窗口内(即 deque[0] 小于窗口的左边界),如果是,则将其从队列中移除。
3、然后,将当前遍历到的元素的索引加入队列尾部。在加入之前,移除队列尾部那些比当前元素小的所有元素,因为它们不可能成为后续窗口中的最大值。
4、当遍历到的索引大于或等于 k-1 时(即窗口已经形成),将当前窗口的最大值(即 deque[0] 对应的元素)加入结果集中。

python">
```python
from collections import dequedef maxSlidingWindow(nums, k):if not nums:return []deque_window = deque()max_values = []for i in range(len(nums)):# 移除窗口外的元素if deque_window and deque_window[0] < i - k + 1:deque_window.popleft()# 移除所有小于当前元素的元素while deque_window and nums[deque_window[-1]] < nums[i]:deque_window.pop()# 添加当前元素的索引deque_window.append(i)# 当前窗口形成时,将最大值加入结果集if i >= k - 1:max_values.append(nums[deque_window[0]])return max_values

或者自定义单调栈

python">from collections import dequeclass MyQueue:def __init__(self):self.queue = deque()def pop(self, value):if self.queue and value == self.queue[0]:self.queue.popleft()def push(self, value):while self.queue and value > self.queue[-1]:self.queue.pop()self.queue.append(value)def front(self):return self.queue[0]class Solution:def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:que = MyQueue()res = []# 先将前k的元素导入单调递减队列for i in range(k):que.push(nums[i])res.append(que.front())# 移动窗口for i in range(k, len(nums)):que.pop(nums[i - k])que.push(nums[i])res.append(que.front())return res

http://www.ppmy.cn/devtools/98147.html

相关文章

RabbitMQ实现延迟消息的两种方法(提供延迟插件)

在消息队列&#xff08;MQ&#xff09;中实现延迟队列有几种常见方法。以下是两种常见的实现方式&#xff1a; 1. 使用死信队列&#xff08;DLQ&#xff09; 这种方法利用了消息的死信特性&#xff1a; 消息过期时间&#xff1a;为消息设置一个TTL&#xff08;Time-To-Live&…

windows C++-windows C++/CX简介(三)

^类型 (^) 是 C/CX 最突出的功能之一——当人们第一次看到 C/CX 代码时&#xff0c;很难不注意到它。那么&#xff0c;^ 类型到底是什么&#xff1f;这是类型是一种智能指针类型&#xff0c;它自动管理 Windows 运行时对象的生命周期&#xff0c;也 提供自动类型转换功能以简化…

ECMAScript性能优化技巧与陷阱

ECMAScript&#xff08;JavaScript&#xff09;的性能优化是一个复杂而重要的话题&#xff0c;尤其是在现代Web开发中。以下是一些常见的性能优化技巧和需要避免的陷阱&#xff1a; 性能优化技巧 避免全局变量&#xff1a; 全局变量会增加查找时间&#xff0c;尽量将变量的作…

Java面试题--JVM大厂篇之高并发Java应用的秘密武器:深入剖析GC优化实战案例

引言: 晚上好,Java开发者们!在高并发的现代应用中,垃圾回收器(GC)是Java性能优化的重要环节。尤其在CMS(Concurrent Mark-Sweep)GC曾经担任主角的日子里,适当的调优和优化措施至关重要。本篇文章将通过三个实际案例,探讨如何在不同场景中优化CMS GC,为你揭示Java性能…

【hot100篇-python刷题记录】【爬楼梯】

R5-真正的动态规划 动态规划核心&#xff1a; 第i步是怎么来的&#xff08;即动态规划公式&#xff09; 走到第i步阶梯的总方法数sum(走到第i-1步阶梯的总方法数&#xff0c;走到第i-2步阶梯的总方法数) class Solution:def climbStairs(self, n: int) -> int:if n<2:r…

电源噪声对高分辨率ADC影响

1 简介 ADC本身需要外部电源供电&#xff0c;而且&#xff0c;与混合信号数据采集系统中的任何其他组件一样&#xff0c;电源也会产生噪声。 电源噪声与其他噪声类似&#xff0c;对系统性能的影响主要取决于电源噪声的级别和类型。例如便携式应用的3V锂离子电池通常比用于测…

Vault密钥管理的基本概述

Vault密钥管理是一种加密密钥管理解决方案&#xff0c;旨在帮助组织管理其加密密钥&#xff0c;并确保这些密钥的安全性和可用性。以下是关于Vault密钥管理的详细介绍&#xff1a; 一、Vault的基本概述 Vault由HashiCorp开发&#xff0c;是一种用于保护、存储和严格控制对令牌、…

Linux 操作系统 --- 信号

序言 在本篇内容中&#xff0c;将为大家介绍在操作系统中的一个重要的机制 — 信号。大家可能感到疑惑&#xff0c;好像我在使用 Linux 的过程中并没有接触过信号&#xff0c;这是啥呀&#xff1f;其实我们经常遇到过&#xff0c;当我们运行的进程当进程尝试访问非法内存地址时…