- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在解决来自 LeetCode.com 的问题:
Given an array of non-negative integers, you are initially positioned at the first index of the array. Each element in the array represents your maximum jump length at that position. Determine if you are able to reach the last index. For example: A = [2,3,1,1,4], return true. A = [3,2,1,0,4], return false.
投票最多的解决方案之一 ( here ) 表示以下是使用贪婪方法:
bool canJump(int A[], int n) {
int last=n-1,i,j;
for(i=n-2;i>=0;i--){
if(i+A[i]>=last)last=i;
}
return last<=0;
}
我有两个问题:
我认为这可以通过动态规划来解决。我知道 DP 可以解决的问题可以用贪心法解决,但是这个特殊问题背后的直觉是什么使得用贪心法解决更有意义?
这SO question一定程度上凸显了这种差异。我知道这可能有点多,但如果可能的话,有人可以在这种情况下回答这个问题吗?我将不胜感激。
谢谢。
编辑:我认为造成我困惑的原因之一是输入 [3,3,1,0,4]
.根据贪心范式,当 i=0
时,我们不会进行大小为 3
(A[0]
) 的跳跃,以便贪婪地达到输出?但这样做实际上是不正确的。
最佳答案
根据维基百科:
A greedy algorithm is an algorithmic paradigm that follows the problem solving heuristic of making the locally optimal choice at each stage with the hope of finding a global optimum.
在这里,我想提请您注意关键词,每个阶段的局部最优选择,这使得算法范式变得贪婪。
Q1. What is the intuition behind using a greedy algorithm for this?
由于在这道题中,我们只关心是否可以到达数组的最后一个索引,所以可以使用贪心算法。贪婪算法会在每一步选择最优选择(跳得最大),并在最后检查最大索引是否可以到达终点。
比如说,如果我们需要找出每个索引处的跳转大小以到达终点或需要优化跳转次数以到达终点,那么直接使用贪心算法将达不到我们的目的。
Q2. How is the above solution a greedy algorithm?
上面代码中的 if
条件 - if(i+A[i]>=last)last=i;
使算法变得贪婪,因为我们取了最大值如果可能就跳转 (i+A[i]>=last
)。
提供的分析here可能对你有帮助。
编辑
让我们谈谈您提到的输入 - [3,3,1,0,4]
。
i=0
时,算法检查我们可以从 i=0
到达的最大索引是多少。 i=1
到达的最大索引是多少。由于我们移动到 i=1
,因此可以保证我们可以从索引 0 到达索引 1(无论跳跃大小是多少)。请注意,在这个问题中,我们不关心是否应该在 i=0
处进行大小为 3 的跳跃,尽管我们知道这不会帮助我们到达终点。我们关心的是我们是否可以通过跳跃到达终点或超越终点指标。
关于c++ - 他贪心吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47169611/
>>> import re >>> p = re.compile('.*&l=(.*)(&|$)') >>> p.search('foo&l=something here&bleh').group(1
最近有一道面试题如下:我们得到了一个单词列表,我们想要格式化它们以最大化回车符的数量,同时将每行的字母数量保持在一个范围内。 例如,我们希望每行的字母范围为 5 - 10(含),一种解决方案是: he
我正在使用二维数组来处理游戏中的对象。数组的维度就像笛卡尔网格上的坐标。当玩家选择一个点时,我想从数组中收集 N 个最近的网格单元,即使该点不是有效的数组索引。 例子:从 [0,0] 到 [10,10
我在 Hibernate 之上使用 Olingo 1.2。 我有一个返回 250 行的请求,每行以一对多关系链接到另一个表。 我执行 $expand 以获取子表中的所有数据,但是当我检查在数据库中执行
我正在 ANTLR4 中构建语法,但收到此警告 TL4.g4:224:12: greedy block ()* contains wildcard;非贪婪语法 ()*?可能是首选 这是它引用的代码行
In the default greedy mode, all data offered to targets are accepted, even if the other target doesn
假设我有 n 个盒子,每个盒子里面都有一些值 b[i] .我可以保证对一组框进行排序,使得 b[1] j; { min_{k=i}^j (c[k] + max(T(i, k-1)
本文已收录到 AndroidFamily ,技术和职场问题,请关注公众号 [彭旭锐] 提问。 大家好,我是小彭。 上周末是 LeetCode 第 339 场周赛,你参加
什么是 PHP 中的“贪心 token 解析”?我在 Codeigniter 指南中找到了这个: “除非需要解析变量,否则始终使用单引号字符串,并且在确实需要解析变量的情况下,使用大括号防止贪婪的标记
本文已收录到 AndroidFamily ,技术和职场问题,请关注公众号 [彭旭锐] 提问。 大家好,我是小彭。 上周末是 LeetCode 第 337 场周赛,你参加
我是一名优秀的程序员,十分优秀!