116. 跳跃游戏(回顾)
116. 跳跃游戏
中文English
给出一个非负整数数组,你最初定位在数组的第一个位置。
数组中的每个元素代表你在那个位置可以跳跃的最大长度。
判断你是否能到达数组的最后一个位置。
样例
样例 1
输入 : [2,3,1,1,4]
输出 : true
样例 2
输入 : [3,2,1,0,4]
输出 : false
挑战
这个问题有两个方法,一个是贪心
和 动态规划
。
贪心
方法时间复杂度为O(N)
。
动态规划
方法的时间复杂度为为O(n^2)
。
我们手动设置小型数据集,使大家可以通过测试的两种方式。这仅仅是为了让大家学会如何使用动态规划的方式解决此问题。如果您用动态规划的方式完成它,你可以尝试贪心法,以使其再次通过一次。
注意事项
数组A
的长度不超过5000,每个元素的大小不超过5000
class Solution: """ @param A: A list of integers @return: A boolean """ def canJump(self, A): # write your code here ans = 0 p = 0 for i in A[:-1]: ans = max(ans,i+p) if ans <= p: return False p += 1 return True
117. 跳跃游戏 II
中文English
给出一个非负整数数组,你最初定位在数组的第一个位置。
数组中的每个元素代表你在那个位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
样例
样例 1
输入 : [2,3,1,1,4]
输出 : 2
解释 : 到达最后位置的最小跳跃次数是2(从下标0到1跳跃1个距离长度,然后跳跃3个距离长度到最后位置)
class Solution: """ @param A: A list of integers @return: An integer """ def jump(self, A): # write your code here ans = 0 p = 0 c = 0 for i in A[:-1]: #如果当前位置+跳跃长度 > ans 的话,说明需要跳一次,此时需要计数,c += 1 if i+p > ans: ans = i + p c += 1 #如果最大跳跃长度已经大于最大长度的话,就可以break if ans >= len(A[:-1]): return c p += 1 return 0