Skip to content

Commit 7200781

Browse files
committed
239.滑动窗口最大值,单调递减双端队列
1 parent bb3c9ff commit 7200781

File tree

2 files changed

+35
-0
lines changed

2 files changed

+35
-0
lines changed

leetcode_Java/DoneTitle.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@
7979
232. 用栈实现队列
8080
234. 回文链表
8181
236. 二叉树的最近公共祖先
82+
239. 滑动窗口最大值
8283
279. 完全平方数
8384
283. 移动零
8485
300. 最长上升子序列

leetcode_Java/Solution0239.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// 239. 滑动窗口最大值
2+
3+
4+
/*
5+
剑指offer 64.滑动窗口的最大值
6+
双端队列,单调递减队列:
7+
1、根据数组长度和窗口大小,初始化结果数组长度
8+
2、队列存放的是索引,既能通过索引判断是否在窗口内,也能通过索引获取元素值
9+
3、遍历数组元素
10+
1)当队列不为空 且 当前元素大于等于队尾元素,则弹出队尾元素,循环处理
11+
2)当前元素加入队尾。此时队列是单调递减队列
12+
3)检查队首索引是否在窗口内,不在窗口内则弹出队首索引
13+
4)当前滑动窗口大小为k时,队首索引的元素是窗口内的最大值,加入结果数组
14+
*/
15+
class Solution {
16+
public int[] maxSlidingWindow(int[] nums, int k) {
17+
int n = nums.length;
18+
int[] res = new int[n - k + 1];
19+
Deque<Integer> queue = new ArrayDeque<>();
20+
for (int i = 0; i < n; i++) {
21+
while (!queue.isEmpty() && nums[i] >= nums[queue.peekLast()]) {
22+
queue.pollLast();
23+
}
24+
queue.addLast(i);
25+
if (queue.peek() == i - k) {
26+
queue.poll();
27+
}
28+
if (i + 1 >= k) {
29+
res[i + 1 - k] = nums[queue.peek()];
30+
}
31+
}
32+
return res;
33+
}
34+
}

0 commit comments

Comments
 (0)