标签:
给定一个非负整数数组,假定你的初始位置为数组第一个下标。数组中的每个元素代表你在那个位置能够跳跃的最大长度。
请确认你是否能够跳跃到数组的最后一个下标。
例如:
A = [2,3,1,1,4],
return ture
A = [3,2,1,0,4],
return false.
格式:
第一行输入一个正整数n,接下来的一行,输入数组A[n]。如果能跳到最后一个下标,输出"true",否则输出"false"
样例1
????输入:????
????????5
????????2 0 2 0 1
????输出:
????????True
?
这道题应使用贪心的算法(思路?)来解决,对于题目给出的数列,从第一个数开始,寻找该数可跳跃到的"可到达距离最大"的位置
直至到达可到达的最大位置
例如,对于样例,各个位置可到达的最远距离为
0+2,1+0,2+2,3+0,4+1
从第一个位置,我们可跳跃至 1 2 两个位置,我们理应选择 2位置,因为其可到达距离更远,选择它后下一步决策才有可能得出最优选择
(即跳跃到可到达距离最大的位置)因为 1 "可以跳跃到的" 任何大于2 的位置 2 都可以跳跃到,且 2 可跳跃到的 1 不一定能跳跃到,
当然,以上情况中,我们选取的 maxi 位置 比 其他位置 都小,故上述推论正确,但是,如果,maxi大于其他位置
比如 对于 输入数据 3 1 2 4 1 0 0
各个位置可到达的最远距离为
3 2 4 7 5 5 6
从 0 位置我们可以跳至 1 2 3 位置,按照上述思路,我们应当选择 跳至3 号位置 ,但是存在3 号位置无法跳跃到但 1 号 位置可以跳跃到
的位置 --2 号位置,有没有可能 因此错过最优解呢?不可能,因为 任意 2 号 位置 可到达的位置 3 号都可以到达 。总之,任何其他位置可以
直接或间接到达的位置,maxi位置都可以到达,故这样的贪心选择不会遗漏最优解。
个人吐槽,这题看完后我基本是2 3 分钟就想出来算法,但我实现起来尼玛花了整整 2 30分钟。。各种特殊情况与可能出现的死循环让我搞了好久
--__--!!
标签:
原文地址:http://www.cnblogs.com/Dadio/p/5158913.html