lintcode_116. 跳跃游戏

给出一个非负整数数组,你最初定位在数组的第一个位置。   

数组中的每个元素代表你在那个位置可以跳跃的最大长度。    

判断你是否能到达数组的最后一个位置。

 注意事项

这个问题有两个方法,一个是贪心和 动态规划

贪心方法时间复杂度为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

 

posted @ 2017-12-21 10:07  Tom_NCU  阅读(162)  评论(0编辑  收藏  举报