Leetcode做题日记:55. 跳跃游戏(PYTHON)

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

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

判断你是否能够到达最后一个位置。

示例 1:

输入: [2,3,1,1,4]
输出: true
解释: 从位置 0 到 1 跳 1 步, 然后跳 3 步到达最后一个位置。

示例 2:

输入: [3,2,1,0,4]
输出: false
解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。
第一次的代码,现在跳到0就跳不动了,和上一个跳跃游戏有一些不一样
我们选择下一轮能跳得最远的点,并且我们选择跳的点不是0,比如[3,4,8],在起点处可以跳3格,那么下一轮分别可以跳1+4,2+8格,当能跳的最远的点,例如2+8超过了nums的终点时,表明可以达到
还要设置一个条件,当跳到0的时候,如果还有选择,就跳其他地方,否则返回False

	top=0 #起点
        if len(nums)==1:
            return True
        while True:
            max_top=0
            m=0
            for i in range(1,nums[top]+1):#以起点开始,从1跳到nums[top]
 #如果在nums[top]范围内就能达到终点,或者下一轮能跳最远点点能达到终点,返回True         
                if top+i>=len(nums)-1 or nums[top+i]+i>=len(nums)-1:
		    return True
#如果当前i步能跳最远的点超过当前最远值,并且第i步的值不为0,则更新
#能跳最远值,并且记录此时的步数m=i                        
                if nums[top+i]+i>max_top and nums[top+i]!=0:
                    max_top=max(max_top,nums[top+i]+i)
                    m=i
            if m==0: #如果m未得到更新,表明跳不动,返回False
                return False
            top=top+m #更新参数,跳到top+m处

52ms,排名13.8%
有点靠后了,第二次的代码:
把while+for循环变为一个for循环,如果当前位置i超过了上一步的最大能到的位置,返回False,max_top的设置就非常巧妙了,取本身和当前位置i下一轮能走的最大步长的最大值

	max_top=0
        for i in range(len(nums)):
            if i>max_top: #如果位置i大于之前的最大能到的位置
                return False
            max_top=max(max_top,i+nums[i]) #更新最大能到的位置
        return True

36ms,排名68%

你可能感兴趣的:(leetcode)