1
1
# 贪婪策略
2
2
3
- 贪婪策略是一种常见的算法思想,具体是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关,这点和动态规划一样。贪婪策略和动态规划类似,大多数情况也都是用来处理` 极值问题 ` 。
3
+ 贪婪策略是一种常见的算法思想。具体是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑。他所做出的是在某种意义上的局部最优解。贪心算法并不是对所有问题都能得到整体最优解,比如硬币找零问题,关键是贪心策略的选择。
4
+
5
+ 选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关,这点和动态规划一样。贪婪策略和动态规划类似,大多数情况也都是用来处理` 极值问题 ` 。
4
6
5
7
LeetCode 上对于贪婪策略有 73 道题目。我们将其分成几个类型来讲解,截止目前我们暂时只提供` 覆盖 ` 问题,其他类型可以期待我的新书或者之后的题解文章。
6
8
@@ -20,6 +22,7 @@ LeetCode 上对于贪婪策略有 73 道题目。我们将其分成几个类型
20
22
21
23
#### 题目描述
22
24
25
+ ```
23
26
给定一个非负整数数组,你最初位于数组的第一个位置。
24
27
25
28
数组中的每个元素代表你在该位置可以跳跃的最大长度。
@@ -35,20 +38,20 @@ LeetCode 上对于贪婪策略有 73 道题目。我们将其分成几个类型
35
38
说明:
36
39
37
40
假设你总是可以到达数组的最后一个位置。
38
-
41
+ ```
39
42
#### 思路
40
43
41
- 贪婪策略,即我们每次在可跳范围内选择可以使得跳的更远的位置,由于题目保证了 ` 你总是可以到达数组的最后一个位置 ` ,因此这种算法是完备的 。
44
+ 这里我们使用贪婪策略来解。即每次都在可跳范围内选择可以跳地更远的位置 。
42
45
43
- 如下图,开始的位置是 2,可跳的范围是橙色的。然后因为 3 可以跳的更远,所以跳到 3 的位置。
46
+ 如下图,开始的位置是 2,可跳的范围是橙色节点的。由于 3 可以跳的更远,足以覆盖 2 的情况,因此应该跳到 3 的位置。
44
47
45
48
![ ] ( https://tva1.sinaimg.cn/large/007S8ZIlly1ghluifqw9sj309i03xq2t.jpg )
46
49
47
- 如下图,然后现在的位置就是 3 了 ,能跳的范围是橙色的,然后因为 4 可以跳的更远,所以下次跳到 4 的位置。
50
+ 当我们跳到 3 的位置后。 如下图 ,能跳的范围是橙色的 1,1,4。由于 4 可以跳的更远,因此跳到 4 的位置。
48
51
49
52
![ ] ( https://tva1.sinaimg.cn/large/007S8ZIlly1ghluimff8dj30c1039wed.jpg )
50
53
51
- 写代码的话,我们用 end 表示当前能跳的边界,对于上边第一个图的橙色 1,第二个图中就是橙色的 4,遍历数组的时候, 到了边界,我们就重新更新新的边界 。
54
+ 写代码的话,我们可以使用 end 表示当前能跳的边界,对应第一个图的橙色 1,第二个图的橙色 4。并且遍历数组的时候, 到了边界,就重新更新边界 。
52
55
53
56
> 图来自 https://leetcode-cn.com/u/windliang/
54
57
@@ -80,7 +83,7 @@ class Solution:
80
83
### 1024. 视频拼接
81
84
82
85
#### 题目描述
83
-
86
+ ```
84
87
你将会获得一系列视频片段,这些片段来自于一项持续时长为 T 秒的体育赛事。这些片段可能有所重叠,也可能长度不一。
85
88
86
89
视频片段 clips[i] 都用区间进行表示:开始于 clips[i][0] 并于 clips[i][1] 结束。我们甚至可以对这些片段自由地再剪辑,例如片段 [0, 7] 可以剪切成 [0, 1] + [1, 3] + [3, 7] 三部分。
@@ -120,24 +123,16 @@ class Solution:
120
123
1 <= clips.length <= 100
121
124
0 <= clips[i][0], clips[i][1] <= 100
122
125
0 <= T <= 100
123
-
126
+ ```
124
127
#### 思路
125
128
126
- 贪婪策略,我们选择满足条件的最大值。和上面的不同,这次我们需要手动进行一次排序,实际上贪婪策略经常伴随着排序,我们按照 clip[ 0] 从小到大进行排序。
127
-
128
- ![ ] ( https://tva1.sinaimg.cn/large/007S8ZIlly1ghluind4orj30yg0i00um.jpg )
129
-
130
- 上一题的思路是维护一个 furthest,end 变量,不断贪心更新。 这一道题也是如此,不同的点是本题的数据是一个二维数组。 不过如果你彻底理解了上面的题,我想这道题也难不倒你。
129
+ 这里我们仍然使用贪婪策略来解。上一题的思路是维护一个 furthest,end 变量,不断贪心更新。 这一道题也是如此,不同的点是本题的数据是一个二维数组。 不过如果你彻底理解了上面的题,我想这道题也难不倒你。
131
130
132
131
我们来看下这道题究竟和上面的题有多像。
133
132
134
- 以题目给的数据为例:
135
-
136
- clips = [[ 0,1] ,[ 6,8] ,[ 0,2] ,[ 5,6] ,[ 0,4] ,[ 0,3] ,[ 6,7] ,[ 1,3] ,[ 4,7] ,[ 1,4] ,[ 2,5] ,[ 2,6] ,[ 3,4] ,[ 4,5] ,[ 5,7] ,[ 6,9]] , T = 9
137
-
138
- 我们对原数组按开始时间排序,并先看前面的一部分:
133
+ 以题目给的数据为例:` clips = [[0,1],[6,8],[0,2],[5,6],[0,4],[0,3],[6,7],[1,3],[4,7],[1,4],[2,5],[2,6],[3,4],[4,5],[5,7],[6,9]], T = 9 `
139
134
140
- [[ 0,1] , [ 0,2] , [ 0,3] , [ 0,4] , [ 1,3] , [ 1,4] , [ 2,5] , [ 2,6] ...]
135
+ 我们对原数组按开始时间排序,并先看前面的一部分: ` [[0,1], [0,2], [0,3], [0,4], [1,3], [1,4], [2,5], [2,6], ...] `
141
136
142
137
> 注意并不需要真正地排序,而是类似桶排序的思路,使用额外的空间,具体参考代码区
143
138
@@ -184,6 +179,7 @@ class Solution:
184
179
185
180
#### 题目描述
186
181
182
+ ```
187
183
在 x 轴上有一个一维的花园。花园长度为 n,从点 0 开始,到点 n 结束。
188
184
189
185
花园里总共有 n + 1 个水龙头,分别位于 [0, 1, ..., n] 。
@@ -229,7 +225,7 @@ class Solution:
229
225
1 <= n <= 10^4
230
226
ranges.length == n + 1
231
227
0 <= ranges[i] <= 100
232
-
228
+ ```
233
229
#### 思路
234
230
235
231
和上面的题思路还是一样的。我们仍然采用贪心策略,继续沿用上面的思路,尽量找到能够覆盖最远(右边)位置的水龙头,并记录它最右覆盖的土地。
0 commit comments