小白如何如何理解滑动窗口最大值问题python

文章目录

题目描述

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

举例:

输入: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 3

1 3 -1 -3 5 3 6 7 3

1 3 -1 -3 5 3 6 7 5

1 3 -1 -3 5 3 6 7 5

1 3 -1 -3 5 3 6 7 6

1 3 -1 -3 5 3 6 7 7

思路

很容易想到暴力求解,遍历数据i:i+k取出max最大值即可,但是这种做法容易暴力超时,因此引出了自DIY的队列,主要关注的是什么时候弹出,什么时候加入队列

什么时候弹出元素

1.当遍历个数大于k的时候,弹出queue左侧==numsi-k

2.当队列最右侧元素小于numsi,弹出右侧元素,因为他不可能是最大值了,队列内最多只有k个值,所以遍历到的这个元素才能成为最大值

什么时候加入元素

没遍历一次长度大于k的时候就加元素

代码示例和解释

python 复制代码
from collections import deque
def max SlidingWindow(nums, k):
	queue = deque() # 双端都能插入删除的队列
	res = [] # 存放最后的结果
	# 把前面三个元素按需求加入到deque
	for i in range(k):
		while queue and nums[i] > queue[-1]:
			queue.pop() # 弹出右边的元素,不可能成为最大值
		deque.append(nums[i])
	# 从k开始遍历后面的每个元素
	for i in range(k, len(nums)):
		# 只有遍历到的元素queue[0]等于nums[i-k]才需要弹出元素
		if queue and queue[0] == nums[i-k]:
			queue.popleft()
		while queue and queue[-1] < nums[i]:
			queue.pop()
		queue.append(nums[i])
		res.append(queue[0]) # 加入最大值
	return res

*注意点queue内部的元素个数一定是小于等于k的,比如k = 3的时候,因为遍历到长度第4个元素,如果queue首元素和numsi-k元素相等就会有pop操作,即使不相等,其他需要pop()的元素也会被push的过程弹出,所以queue的长度始终不可能大于k

相关推荐
乐观勇敢坚强的老彭24 分钟前
C++ 竞赛常用算法模板速查表
开发语言·c++·算法
高洁0129 分钟前
工信部教考中心证书
人工智能·深度学习·算法·机器学习·知识图谱
我变成萤火虫1 小时前
河南萌新联赛2026第(三)场:郑州轻工业大学
数据结构·c++·算法·贪心算法·stl·深度优先·哈希算法
Dr.kangder1 小时前
嵌入式面试总结(十九)——内存泄露
单片机·算法·面试·职场和发展·架构·硬件架构
Herbert_hwt1 小时前
【C语言基础】常量、选择结构与运算符全解析
c语言·开发语言·算法
Suxing92 小时前
C语言基础分享:从“租房”到“拆迁”,C语言动态内存管理
java·数据结构·算法
LuminousCPP2 小时前
单链表专题(四)-刷题复盘篇-LeetCode 138 随机链表复制|原地拷贝法突破复杂指针操作
数据结构·笔记·算法·leetcode·链表
逆境不可逃3 小时前
【LeetCode 912】排序数组——随机化快速排序详解
数据结构·算法·排序算法
Coder-magician3 小时前
《代码随想录》刷题打卡day31:动态规划-背包问题part02
算法·动态规划
薛定e的猫咪3 小时前
从因果视角解决多智能体协作:细读 SCIC 算法
算法