给出一个非负整数数组,你最初定位在数组的第一个位置。
数组中的每个元素代表你在那个位置可以跳跃的最大长度。
判断你是否能到达数组的最后一个位置。
注意事项
这个问题有两个方法,一个是贪心
和 动态规划
。
贪心
方法时间复杂度为O(N)
。
动态规划
方法的时间复杂度为为O(n^2)
。
我们手动设置小型数据集,使大家可以通过测试的两种方式。这仅仅是为了让大家学会如何使用动态规划的方式解决此问题。如果您用动态规划的方式完成它,你可以尝试贪心法,以使其再次通过一次。
样例
A = [2,3,1,1,4],返回 true.
A = [3,2,1,0,4],返回 false.
思路:
想象一个指针从位置0处开始移动,他可以移动的范围等于当前位置坐标加当前坐标对应的A[i],当范围能覆盖上最后一点时,则可以跳跃到最后,否则不行
class Solution: """ @param: A: A list of integers @return: A boolean """ def canJump(self, A): now = 0 #指针从0开始 now_range = A[now] + now #初始范围 if len(A) == 1: return True while now < len(A) - 1: #不断向后移动,直至最后一点 now = now_range for i in range(now_range): now_range = max(now_range,i+A[i]) #可移动范围在不断扩大 if now_range >= len(A)-1: #范围包括最后时,则返回True return True if now == now_range: #一次循环范围没有增加,说明停止了无法前行,返回False return False return False
九章算法:
将两个循环简化成了单循环
class Solution: # @param A, a list of integers # @return a boolean def canJump(self, A): p = 0 ans = 0 for item in A[:-1]: ans = max(ans, p + item) if(ans <= p): return False p += 1 return True