239. 滑动窗口最大值(优先队列和滑动窗口)

使用优先队列解决滑动窗口最大值问题,详细解释解题思路和代码实现,包括时间复杂度和空间复杂度分析。
摘要由CSDN通过智能技术生成

滑动窗口最大值

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

示例 1:
输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
输出:[3,3,5,5,6,7]
解释:
在这里插入图片描述

示例 2:
输入:nums = [1], k = 1
输出:[1]

示例 3:
输入:nums = [1,-1], k = 1
输出:[1,-1]

示例 4:
输入:nums = [9,11], k = 2
输出:[11]

示例 5:
输入:nums = [4,-2], k = 2
输出:[4]


解题思路

滑动窗口和优先队列
滑动窗口的大小是固定的 == k(从开始到结束,窗口的大小不变,一直为 k)。

(1) 先将第一个窗口中的元素放到优先队列中(大根堆,需要重写 compare 方法(用 lambda 表达式)),其中在优先队列中存放的是一个二元组(num, index):表示元素 num 和它在数组 nums 中的位置 index (为方便判断堆顶元素与滑动窗口的位置关系),然后直接将堆顶元素放到 res 数组中即得到第一个窗口的中的最大值。

(2) 从第二个窗口开始,每次遍历 nums 数组中的一个元素,就把该元素的元素值 num 和它在 nums 数组中的位置i保存到优先队列中。

  • 此时因为优先队列中没有移除任何元素,所以当前优先队列的堆顶元素(最大值)可能不在当前的滑动窗口中。
  • 此时需要进行判断,即 pqNums.peek()[1] < right - k + 1。判断当前堆顶元素在 nums 数组中的位置是否在当前的滑动窗口中(right - k + 1是当前窗口的左端点的元素的下标):若不在,则直接将当前的堆顶元素 poll 掉,并且再次进行判断,直到当前的堆顶元素在当前的滑动窗口中为止,然后将该元素放到 res 数组中。

(3) 最后,直接返回数组 res 即可。

提示若用优先队列中的 remove 方法,则会代码执行会超时(尽量不要用 remove 方法)。


代码

class Solution 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值