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
            
 
posted @ 2020-05-10 17:14  风不再来  阅读(186)  评论(0编辑  收藏  举报