Sliding Window Maximum
Given an array nums, there is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in the window. Each time the sliding window moves right by one position. Return the max sliding window.
(寻找大小为 k 的滑动窗口中的最大值)
Example:
1.常规思路
遍历数组,每次计算最大值,时间复杂度为O(N*K), 实际操作中会 TLE.
2. 最大堆
堆分为最小堆和最大堆,是一种完全二叉树的结构,最小(大)堆的每个节点均不大(小)于为其孩子节点的值。
1 | import heapq |
3. 双端队列
双端队列类似于一个list,但是可以对两段都进行加入或删除操作。
使用双端队列,队列元素降序排序,队首元素为所求最大值。滑动窗口右移,每次窗口右移的时候需要判断当前的最大值是否在有效范围,若不在,则需要将其从队列中删除。若出现的元素比队尾(最小元素)大,此时移除比起小的数。时间复杂度为 O(n),空间复杂度为 O(k),具体实现过程如下:
1 | from collections import deque |
应用:构造哈夫曼树,任务调度算法