Skip to content

Commit 96a1826

Browse files
committed
Update 0239. 滑动窗口最大值.md
1 parent 40b3dfd commit 96a1826

File tree

1 file changed

+42
-9
lines changed

1 file changed

+42
-9
lines changed

Solutions/0239. 滑动窗口最大值.md

Lines changed: 42 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,51 @@
55

66
## 题目大意
77

8-
给定一个整数数组 `nums`,再给定一个整数 `k`,表示为大小为 `k` 的滑动窗口从数组的最左侧移动到数组的最右侧。我们只能看到滑动窗口内的 `k` 个数字,滑动窗口每次只能向右移动一位。
8+
**描述**给定一个整数数组 `nums`,再给定一个整数 `k`,表示为大小为 `k` 的滑动窗口从数组的最左侧移动到数组的最右侧。我们只能看到滑动窗口内的 `k` 个数字,滑动窗口每次只能向右移动一位。
99

10-
要求:返回滑动窗口中的最大值。
10+
**要求**:返回滑动窗口中的最大值。
11+
12+
**说明**
13+
14+
- $1 \le nums.length \le 10^5$。
15+
- $-10^4 \le nums[i] \le 10^4$。
16+
- $1 \le k \le nums.length$。
17+
18+
**示例**
19+
20+
```Python
21+
输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
22+
输出:[3,3,5,5,6,7]
23+
解释:
24+
滑动窗口的位置 最大值
25+
--------------- -----
26+
[1 3 -1] -3 5 3 6 7 3
27+
1 [3 -1 -3] 5 3 6 7 3
28+
1 3 [-1 -3 5] 3 6 7 5
29+
1 3 -1 [-3 5 3] 6 7 5
30+
1 3 -1 -3 [5 3 6] 7 6
31+
1 3 -1 -3 5 [3 6 7] 7
32+
33+
34+
输入:nums = [1], k = 1
35+
输出:[1]
36+
```
1137

1238
## 解题思路
1339

14-
暴力求解的话,二重循环,时间复杂度为 $O(n * k)$。
40+
暴力求解的话,需要使用二重循环遍历,其时间复杂度为 $O(n * k)$。根据题目给定的数据范围,肯定会超时
1541

1642
我们可以使用优先队列来做。
1743

18-
- 初始的时候将前 `k` 个元素加入优先队列的二叉堆中。存入优先队列的是数组值和索引的元组。优先队列将数组值作为优先级。
19-
- 然后滑动窗口从第 `k` 个元素开始遍历,将当前数组值和索引的元组插入到二叉堆中。
20-
- 当二叉堆堆顶元素的索引已经不在滑动窗口的范围中时,即 `q[0][1] <= i - k` 时,不断删除堆顶元素,直到最大值元素的索引在滑动窗口的范围中。
21-
- 将最大值加入到答案数组中,继续滑动。
22-
- 最后遍历完输出答案数组。
44+
### 思路 1:优先队列
45+
46+
1. 初始的时候将前 `k` 个元素加入优先队列的二叉堆中。存入优先队列的是数组值与索引构成的元组。优先队列将数组值作为优先级。
47+
2. 然后滑动窗口从第 `k` 个元素开始遍历,将当前数组值和索引的元组插入到二叉堆中。
48+
3. 当二叉堆堆顶元素的索引已经不在滑动窗口的范围中时,即 `q[0][1] <= i - k` 时,不断删除堆顶元素,直到最大值元素的索引在滑动窗口的范围中。
49+
4. 将最大值加入到答案数组中,继续向右滑动。
50+
5. 滑动结束时,输出答案数组。
2351

24-
## 代码
52+
### 思路 1:代码
2553

2654
```Python
2755
class Solution:
@@ -39,3 +67,8 @@ class Solution:
3967
return res
4068
```
4169

70+
### 思路 1:复杂度分析
71+
72+
- **时间复杂度**:$O(n \times \log_2n)$。
73+
- **空间复杂度**:$O(k)$。
74+

0 commit comments

Comments
 (0)