题目
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。
示例 1:
输入: [2,3,1,1,4]
输出: true
解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。
示例 2:
输入: [3,2,1,0,4]
输出: false
解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/jump-game
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
class Solution(object):
def canJump(self, nums):
"""
:type nums: List[int]
:rtype: bool
"""
size = len(nums)
flag = [False]*size
flag[size-1] = True
for i in range(size-1,-1,-1):
if flag[i]:
continue
else:
if nums[i] >= size - i:
flag[i] = True
for j in range(0,nums[i]+1,1):
if i+j >= size:
break
elif flag[i+j]:
flag[i] = True
break
return flag[0]
以上是自己看完题目后写的代码,毫无悬念地超时了…日常怀疑自己不配上学… 之后看了官方题解:贪心方法,时间复杂度为O(N),具体实现代码如下:
class Solution(object):
def canJump(self, nums):
maxStep = len(nums)
curMaxDis = 0
for i in range(maxStep):
if i <= curMaxDis:
curMaxDis = max(curMaxDis, i+nums[i])
if curMaxDis >= maxStep-1:
return True
return False
这道题目最重要的是要理解“如果位置pos可达,则从位置pos到位置pos+num[pos]之间的任意位置都可达 ”,这样我们就可以通过去维护一个最远可达的变量最终来判断是否能够到达最后一个位置。此外在具体编写代码时需要注意遍历数组nums时,要注意当前所遍历的位置是否小于前面每一次跳跃达到的最远距离,如果不满足这个条件,则说明当前位置已经不可达,所以结果是False.