滑动窗口内求最大值和最小值
[AcWing. 154. 滑动窗口内求最大值和最小值]
给定一个大小为 n < 10^6
的数组。
有一个大小为 k
的滑动窗口,它从数组的最左边移动到最右边。
你只能在窗口中看到 k
个数字。
每次滑动窗口向右移动一个位置。
以下是一个例子:
该数组为 [1 3 -1 -3 5 3 6 7]
,k
为 3
。
窗口位置 | 最小值 | 最大值 |
---|---|---|
[1 3 -1] -3 5 3 6 7 | -1 | 3 |
1 [3 -1 -3] 5 3 6 7 | -3 | 3 |
1 3 [-1 -3 5] 3 6 7 | -3 | 5 |
1 3 -1 [-3 5 3] 6 7 | -3 | 5 |
1 3 -1 -3 [5 3 6] 7 | 3 | 6 |
1 3 -1 -3 5 [3 6 7] | 3 | 7 |
你的任务是确定滑动窗口位于每个位置时,窗口中的最大值和最小值。
输入格式
输入包含两行。
第一行包含两个整数 n
和 k
,分别代表数组长度和滑动窗口的长度。
第二行有 n
个整数,代表数组的具体数值。
同行数据之间用空格隔开。
输出格式
输出包含两个。
第一行输出,从左至右,每个位置滑动窗口中的最小值。
第二行输出,从左至右,每个位置滑动窗口中的最大值。
输入样例:
1 |
|
输出样例:
1 |
|
算法思想
滑动窗口,每次滑动一个单位,窗口内求最大最小值
。
借图:
题外话
:在一个从小到大排列的数列中,若左边的数比右边的数大,就称作逆序数啊,如:1,3,5,4,6 中,5就是逆序数啊,看看5在题目中有没有用,若是没有用,那该题就有单调性。
使用双端单调队列:利用双端单调队列来高效维护滑动窗口的最小值和最大值。
维护窗口边界:在每次滑动时,检查队列头部的元素是否已经滑出窗口范围,如果是则移除。
保持单调性:
对于最小值,保持队列单调递增,移除队列中比当前元素大的元素。
对于最大值,保持队列单调递减,移除队列中比当前元素小的元素。
插入新元素:将当前元素的索引插入队列。输出结果:当窗口大小达到要求时,队首元素即为当前窗口的最小值或最大值。
代码实现
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Phbeats-Blog!
评论