【发布时间】:2018-04-20 13:03:44
【问题描述】:
我正在解决来自LeetCode.com的问题:
给定一个非负整数数组,您最初位于数组的第一个索引处。 数组中的每个元素代表您在该位置的最大跳跃长度。 确定您是否能够到达最后一个索引。 例如: A = [2,3,1,1,4],返回真。 A = [3,2,1,0,4],返回 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]) 的大小吗?但这样做实际上是不正确的。
【问题讨论】:
-
链接解决方案中的前几句话完全解释了您所要求的一切。到底是什么让你绊倒了?
-
“贪婪”通常是指始终使用当前状态的第一个可用移动并且从不回溯的算法。
-
我猜你在谈论(这个)[discuss.leetcode.com/topic/3443/…特别是。可能是语法? :) 我发现很难听懂他说的话。
-
@IgorTandetnik,哇,这是一个非常有用的技巧。我从来没有这样想过。回想起来,这对我来说似乎很明显。
-
我不同意这是一个贪心算法。这个问题是一个决策问题,这只是对问题空间进行线性搜索。您可以尝试使用贪心算法来解决相关问题“返回从索引
0到N的移动序列,如果不存在则返回”
标签: c++ algorithm dynamic-programming greedy