题目
分析
这道题如果用暴力法,会十分耗时,时间复杂度在\(O(N^2)\)。如果熟悉双指针,或者STL中的deque
则会豁然开朗。
我们用样例数据模拟一下:
5 3
1 5 3 4 2
第一点,在5
个数中从头到尾选择一个长度为3
的窗口一共可以有三个:[1 5 3]
、[5 3 4]
、[3 4 2]
。也就是总共有\(n-k+1\)个窗口。
第二点,输出应该是5 5 4
。5
在两个窗口中都是最大的,4
在最后一个窗口最大。
详细过程如下:
第0步(i=0
),当前元素num[0]=1
。
步骤 | 操作 | dq | 窗口范围 | 最大值 |
---|---|---|---|---|
移除不在窗口范围的元素 | 队列为空,无需移除。 | [] | [1] | - |
移除比当前元素小的元素 | 队列为空,无需移除。 | [] | [1] | - |
将当前元素加入队列 | 将索引 0 加入队列。 | [0] | [1] | - |
窗口未达到大小k |
不记录结果。 | [0] | [1] | - |
第1步(i=1
),当前元素num[1]=5
步骤 | 操作 | dq | 窗口范围 | 最大值 |
---|---|---|---|---|
移除不在窗口范围的元素 | 队列中索引0 在窗口范围内,无需移除。 |
[0] | [1, 5] | - |
移除比当前元素小的元素 | nums[0] = 1 小于nums[1] = 5 ,移除索引0 。 |
[] | [1,5] | - |
将当前元素加入队列 | 将索引1 加入队列。 |
[1] | [1, 5] | - |
窗口未达到大小k |
不记录结果。 | [1] | [1, 5] | - |
第2步(i=2
),当前元素num[2]=3
步骤 | 操作 | dq | 窗口范围 | 最大值 |
---|---|---|---|---|
移除不在窗口范围的元素 | 队列中索引1 在窗口范围内,无需移除。 |
[1] | [1, 5, 3] | - |
移除比当前元素小的元素 | nums[1] = 5 大于nums[2] = 3 ,不移除。 |
[1] | [1, 5, 3] | - |
将当前元素加入队列 | 将索引2 加入队列。 |
[1, 2] | [1, 5, 3] | - |
窗口达到大小k |
记录结果。当前窗口最大一定是num[1]=5 |
[1, 2] | [1, 5, 3] | 5 |
第3步(i=3
),当前元素num[3]=4
步骤 | 操作 | dq | 窗口范围 | 最大值 |
---|---|---|---|---|
移除不在窗口范围的元素 | 队列中索引1 在窗口范围内,无需移除。 |
[1, 2] | [5, 3, 4] | - |
移除比当前元素小的元素 | nums[2] = 3 小于nums[3] = 4 ,移除。 |
[1] | [5, 3, 4] | - |
将当前元素加入队列 | 将索引3 加入队列。 |
[1, 3] | [5, 3, 4] | - |
窗口达到大小k |
记录结果。当前窗口最大一定是num[1]=5 |
[1, 3] | [5, 3, 4] | 5 |
第4步(i=4
),当前元素num[4]=2
步骤 | 操作 | dq | 窗口范围 | 最大值 |
---|---|---|---|---|
移除不在窗口范围的元素 | 队列中索引1 不在窗口范围内,需移除。 |
[3] | [3, 4, 2] | - |
移除比当前元素小的元素 | nums[3] = 4 大于nums[4] = 2 ,不移除。 |
[3] | [3, 4, 2] | - |
将当前元素加入队列 | 将索引4 加入队列。 |
[3, 4] | [3, 4, 2] | - |
窗口达到大小k |
记录结果。当前窗口最大一定是num[3]=4 |
[3, 4] | [3, 4, 2] | 4 |
答案
思考
在某种程度上,这也是一个双指针的练习题。但如果用STL中的deque
会更简便。