LC239.滑动窗口最大值
题目:
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
示例 1:
1 | 输入:nums = [1,3,-1,-3,5,3,6,7], k = 3 |
[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
示例 2:
1 | 输入:nums = [1], k = 1 |
提示:
1 <= nums.length <= 105
-104 <= nums[i] <= 104
1 <= k <= nums.length
解题思路:
这题其实很容易用错数据结构,很多人一开始肯定会想 “既然是维护滑动窗口内的最大值,那么我直接使用大根堆不就行了么?” 其实使用大根堆是错的,因为大根堆需要排序,时间复杂度会高,其实我们还有一种更快更容易写的数据结构 => 单调队列
单调队列 + 滑动窗口
单调队列 顾名思义,单调,说明队列内的元素要么是单调递增,要么是单调递减。
[0, 6, 8, 10] => 这是单调队列
那么理解了这个含义,其实这道题就很简单了,只要在滑动窗口滑动的时候不断维护我们的单调队列,那么我们这道题就接出来了。
开始滑滑动窗口:
窗口移除的元素与单调队列队首相等时弹出队首
窗口添加的元素与单调队列的队尾进行比较,若队尾 <= 添加的元素 则弹出队尾的元素,直到队尾 > 添加的元素然后将元素推进队尾。
代码:
Python
1 | class Solution: |
C++
1 | class Solution { |
评论
