滑动窗口最大值
给你一个整数数组 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