11# 贪婪策略
22
3- 贪婪策略是一种常见的算法思想,具体是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关,这点和动态规划一样。贪婪策略和动态规划类似,大多数情况也都是用来处理` 极值问题 ` 。
3+ 贪婪策略是一种常见的算法思想。具体是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑。他所做出的是在某种意义上的局部最优解。贪心算法并不是对所有问题都能得到整体最优解,比如硬币找零问题,关键是贪心策略的选择。
4+
5+ 选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关,这点和动态规划一样。贪婪策略和动态规划类似,大多数情况也都是用来处理` 极值问题 ` 。
46
57LeetCode 上对于贪婪策略有 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:
1201231 <= clips.length <= 100
1211240 <= clips[i][0], clips[i][1] <= 100
1221250 <= 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:
2292251 <= n <= 10^4
230226ranges.length == n + 1
2312270 <= ranges[i] <= 100
232-
228+ ```
233229#### 思路
234230
235231和上面的题思路还是一样的。我们仍然采用贪心策略,继续沿用上面的思路,尽量找到能够覆盖最远(右边)位置的水龙头,并记录它最右覆盖的土地。
0 commit comments