Skip to content

Commit 3cea76f

Browse files
committed
三刷239
1 parent 35581b0 commit 3cea76f

File tree

3 files changed

+69
-14
lines changed

3 files changed

+69
-14
lines changed

docs/0239-sliding-window-maximum.adoc

+34-14
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,44 @@
11
[#0239-sliding-window-maximum]
2-
= 239. Sliding Window Maximum
2+
= 239. 滑动窗口最大值
33

4-
{leetcode}/problems/sliding-window-maximum/[LeetCode - Sliding Window Maximum^]
4+
https://leetcode.cn/problems/sliding-window-maximum/[LeetCode - 239. 滑动窗口最大值 ^]
55

6-
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.
6+
给你一个整数数组 `nums`,有一个大小为 `k` 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 `k` 个数字。滑动窗口每次只向右移动一位。
77

8-
.Example:
9-
----
10-
Input: nums = [1,3,-1,-3,5,3,6,7], and k = 3
11-
Output: [3,3,5,5,6,7]
12-
Explanation:
8+
返回 _滑动窗口中的最大值_
9+
10+
*示例 1:*
1311

14-
Window position Max
12+
....
13+
输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
14+
输出:[3,3,5,5,6,7]
15+
解释:
16+
滑动窗口的位置 最大值
1517
--------------- -----
1618
[1 3 -1] -3 5 3 6 7 3
1719
1 [3 -1 -3] 5 3 6 7 3
1820
1 3 [-1 -3 5] 3 6 7 5
1921
1 3 -1 [-3 5 3] 6 7 5
2022
1 3 -1 -3 [5 3 6] 7 6
2123
1 3 -1 -3 5 [3 6 7] 7
22-
----
24+
....
25+
26+
*示例 2:*
2327

24-
*Note:*
28+
....
29+
输入:nums = [1], k = 1
30+
输出:[1]
31+
....
2532

26-
You may assume `k` is always valid, `1 ≤ k ≤` input array's size for non-empty array.
2733

28-
*Follow up:*
34+
*提示:*
2935

30-
Could you solve it in linear time?
36+
* `1 \<= nums.length \<= 10^5^`
37+
* `-10^4^ \<= nums[i] \<= 10^4^`
38+
* `+1 <= k <= nums.length+`
39+
40+
41+
====
3142
3243
== 思路分析
3344
@@ -87,6 +98,15 @@ include::{sourcedir}/_0239_SlidingWindowMaximum.java[tag=answer]
8798
include::{sourcedir}/_0239_SlidingWindowMaximum_2.java[tag=answer]
8899
----
89100
--
101+
102+
三刷::
103+
+
104+
--
105+
[{java_src_attr}]
106+
----
107+
include::{sourcedir}/_0239_SlidingWindowMaximum_3.java[tag=answer]
108+
----
109+
--
90110
====
91111

92112
== 思考题

logbook/202503.adoc

+4
Original file line numberDiff line numberDiff line change
@@ -568,6 +568,10 @@ endif::[]
568568
|{doc_base_url}/0224-basic-calculator.adoc[题解]
569569
|❌ 使用双栈来分别存放数字和操作符。
570570

571+
|{counter:codes2503}
572+
|{leetcode_base_url}/sliding-window-maximum/[239. Sliding Window Maximum^]
573+
|{doc_base_url}/0239-sliding-window-maximum.adoc[题解]
574+
|✅ 单调栈。有很多细节需要考虑。
571575

572576
|===
573577

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.diguage.algo.leetcode;
2+
3+
import java.util.ArrayDeque;
4+
import java.util.Deque;
5+
6+
public class _0239_SlidingWindowMaximum_3 {
7+
// tag::answer[]
8+
9+
/**
10+
* @author D瓜哥 · https://www.diguage.com
11+
* @since 2025-05-01 08:09:17
12+
*/
13+
public int[] maxSlidingWindow(int[] nums, int k) {
14+
Deque<Integer> stack = new ArrayDeque<>(k + 1);
15+
int[] result = new int[nums.length - k + 1];
16+
for (int i = 0; i < nums.length; i++) {
17+
while (!stack.isEmpty() && nums[stack.peekLast()] <= nums[i]) {
18+
stack.pollLast();
19+
}
20+
stack.offerLast(i);
21+
if (stack.peekFirst() <= i - k) {
22+
stack.pollFirst();
23+
}
24+
if (i >= k - 1) {
25+
result[i - k + 1] = nums[stack.peekFirst()];
26+
}
27+
}
28+
return result;
29+
}
30+
// end::answer[]
31+
}

0 commit comments

Comments
 (0)