算法_贪心算法_跳跃游戏

文章目录

  • 跳跃游戏
    • 1.解法
    • 2.总结
      • python

跳跃游戏

leetcode链接

1.解法

对于这道题,最直接的思路就是使用暴力遍历的方法,找到所有的情况,然后看这些情况中是否能够到达数组的最后一个位置。

举个例子:nums = [2,3,1,1,4]

1.首先遍历0号位的数值2,2表示:从0号位可以到达1号位和2号位

此时的覆盖范围变为2号位

(1)然后遍历1号位,1号位的数值是3,那么就可以到达2、3、4号位(这里已经到了最后一个位置,为了把暴力原理说明白,我们继续遍历)
(2)然后遍历2号位,2号位的数值是1,那么就可以到达3号位

此时的覆盖范围变为4号位

2.然后遍历1号位的数值3,3表示:从1号位可以到达2、3、4号位

此时的覆盖范围变为4号位

(1)然后遍历2号位,2号位的数值是1,那么就可以到达3号位
(2)然后遍历3号位,3号位的数值是1,那么就可以到达4号位
(3)4号位不用遍历,因为已经是最后一位了

此时的覆盖范围变为4号位

3.以此类推,遍历2,3号位的数值(最后一位不用遍历,因为无论是几,都不影响是否可以到达该位置)

写出代码:

'''
此代码为示意代码,有一些细节问题没有处理。仅供示意
'''
def canJump(nums):
	cover = 0 # 覆盖范围
	i = 0
	while i<=cover: # i表示当前位置
		for j in range(i+1,nums[i]+1): # j表示从i能到达的位置
			cover = max(cover,j+nums[j])
		if cover>=len(nums)-1:
	        return True
	    i += 1
	return False
		

通过对上面的暴力分析,我们发现,第二步的操作中有好多都在第一步中操作过了,在代码中,重复的位置就是第二层循环。那么我们可以用什么方法把他们统一起来,避免重复操作呢?

我们可以去掉第二层循环,每次只对一个位置求最大范围,然后看看范围是否可以大于最后一个位置。

同样的例子:nums = [2,3,1,1,4]

1.首先遍历0号位的数值2,2表示:从0号位可以到达1号位和2号位

此时覆盖范围为2,即cover = 2

2.然后遍历1号位的数值3,3表示:从1号位可以到达2、3、4号位

此时覆盖范围为4,即cover = 4

4>=len(nums)-1

结束。

代码如下:

def canJump(nums):
    cover = 0
    i = 0

    while i<=cover:
        cover = max(i+nums[i],cover)
        if cover>=len(nums)-1:
            return True
        i += 1

    return False

2.总结

python

python不支持动态修改for循环中变量,可以使用while循环代替

你可能感兴趣的:(算法,算法,leetcode,排序算法)