Skip to content

Commit 57c6630

Browse files
author
lucifer
committed
fix: 贪婪
1 parent 168afaa commit 57c6630

File tree

1 file changed

+16
-20
lines changed

1 file changed

+16
-20
lines changed

thinkings/greedy.md

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
# 贪婪策略
22

3-
贪婪策略是一种常见的算法思想,具体是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关,这点和动态规划一样。贪婪策略和动态规划类似,大多数情况也都是用来处理`极值问题`
3+
贪婪策略是一种常见的算法思想。具体是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑。他所做出的是在某种意义上的局部最优解。贪心算法并不是对所有问题都能得到整体最优解,比如硬币找零问题,关键是贪心策略的选择。
4+
5+
选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关,这点和动态规划一样。贪婪策略和动态规划类似,大多数情况也都是用来处理`极值问题`
46

57
LeetCode 上对于贪婪策略有 73 道题目。我们将其分成几个类型来讲解,截止目前我们暂时只提供`覆盖`问题,其他类型可以期待我的新书或者之后的题解文章。
68

@@ -20,6 +22,7 @@ LeetCode 上对于贪婪策略有 73 道题目。我们将其分成几个类型
2022

2123
#### 题目描述
2224

25+
```
2326
给定一个非负整数数组,你最初位于数组的第一个位置。
2427
2528
数组中的每个元素代表你在该位置可以跳跃的最大长度。
@@ -35,20 +38,20 @@ LeetCode 上对于贪婪策略有 73 道题目。我们将其分成几个类型
3538
说明:
3639
3740
假设你总是可以到达数组的最后一个位置。
38-
41+
```
3942
#### 思路
4043

41-
贪婪策略,即我们每次在可跳范围内选择可以使得跳的更远的位置,由于题目保证了`你总是可以到达数组的最后一个位置`,因此这种算法是完备的
44+
这里我们使用贪婪策略来解。即每次都在可跳范围内选择可以跳地更远的位置
4245

43-
如下图,开始的位置是 2,可跳的范围是橙色的。然后因为 3 可以跳的更远,所以跳到 3 的位置。
46+
如下图,开始的位置是 2,可跳的范围是橙色节点的。由于 3 可以跳的更远,足以覆盖 2 的情况,因此应该跳到 3 的位置。
4447

4548
![](https://tva1.sinaimg.cn/large/007S8ZIlly1ghluifqw9sj309i03xq2t.jpg)
4649

47-
如下图,然后现在的位置就是 3 ,能跳的范围是橙色的,然后因为 4 可以跳的更远,所以下次跳到 4 的位置。
50+
当我们跳到 3 的位置后。 如下图,能跳的范围是橙色的 1,1,4。由于 4 可以跳的更远,因此跳到 4 的位置。
4851

4952
![](https://tva1.sinaimg.cn/large/007S8ZIlly1ghluimff8dj30c1039wed.jpg)
5053

51-
写代码的话,我们用 end 表示当前能跳的边界,对于上边第一个图的橙色 1,第二个图中就是橙色的 4,遍历数组的时候,到了边界,我们就重新更新新的边界
54+
写代码的话,我们可以使用 end 表示当前能跳的边界,对应第一个图的橙色 1,第二个图的橙色 4。并且遍历数组的时候,到了边界,就重新更新边界
5255

5356
> 图来自 https://leetcode-cn.com/u/windliang/
5457
@@ -80,7 +83,7 @@ class Solution:
8083
### 1024. 视频拼接
8184

8285
#### 题目描述
83-
86+
```
8487
你将会获得一系列视频片段,这些片段来自于一项持续时长为  T  秒的体育赛事。这些片段可能有所重叠,也可能长度不一。
8588
8689
视频片段  clips[i]  都用区间进行表示:开始于  clips[i][0]  并于  clips[i][1]  结束。我们甚至可以对这些片段自由地再剪辑,例如片段  [0, 7]  可以剪切成  [0, 1] + [1, 3] + [3, 7]  三部分。
@@ -120,24 +123,16 @@ class Solution:
120123
1 <= clips.length <= 100
121124
0 <= clips[i][0], clips[i][1] <= 100
122125
0 <= T <= 100
123-
126+
```
124127
#### 思路
125128

126-
贪婪策略,我们选择满足条件的最大值。和上面的不同,这次我们需要手动进行一次排序,实际上贪婪策略经常伴随着排序,我们按照 clip[0]从小到大进行排序。
127-
128-
![](https://tva1.sinaimg.cn/large/007S8ZIlly1ghluind4orj30yg0i00um.jpg)
129-
130-
上一题的思路是维护一个 furthest,end 变量,不断贪心更新。 这一道题也是如此,不同的点是本题的数据是一个二维数组。 不过如果你彻底理解了上面的题,我想这道题也难不倒你。
129+
这里我们仍然使用贪婪策略来解。上一题的思路是维护一个 furthest,end 变量,不断贪心更新。 这一道题也是如此,不同的点是本题的数据是一个二维数组。 不过如果你彻底理解了上面的题,我想这道题也难不倒你。
131130

132131
我们来看下这道题究竟和上面的题有多像。
133132

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`
139134

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], ...]`
141136

142137
> 注意并不需要真正地排序,而是类似桶排序的思路,使用额外的空间,具体参考代码区
143138
@@ -184,6 +179,7 @@ class Solution:
184179

185180
#### 题目描述
186181

182+
```
187183
在 x 轴上有一个一维的花园。花园长度为  n,从点  0  开始,到点  n  结束。
188184
189185
花园里总共有  n + 1 个水龙头,分别位于  [0, 1, ..., n] 。
@@ -229,7 +225,7 @@ class Solution:
229225
1 <= n <= 10^4
230226
ranges.length == n + 1
231227
0 <= ranges[i] <= 100
232-
228+
```
233229
#### 思路
234230

235231
和上面的题思路还是一样的。我们仍然采用贪心策略,继续沿用上面的思路,尽量找到能够覆盖最远(右边)位置的水龙头,并记录它最右覆盖的土地。

0 commit comments

Comments
 (0)