问题描述
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。
- 实例
输入: [2,3,1,1,4]
输出: true
解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。
解题思路
利用深度优先搜索的方法求解
每达到一个点,就遍历其可以走的步数
class Solution(object):
def canJump(self, nums):
"""
:type nums: List[int]
:rtype: bool
"""
def dfs(k):
if k == len(nums)-1:
return True
if nums[k] == 0:
return False
for i in range(1,nums[k]+1):
if dfs(k+i):
return True
return False
if len(nums) < 2:
return True
num = nums[0]
for i in range(1, num+1):
if dfs(i):
return True
return False
但是时间超出范围。
利用贪心算法求解
每次达到一个位置,都算出下一次可以达到的最远位置,若该最远位置大于上一次的最远位置,则替代。
class Solution(object):
def canJump(self, nums):
if len(nums)<2:
return True
canmax = 0
for idx, num in enumerate(nums):
if idx > canmax:
return False
if canmax >= len(nums)-1:
return True
if num + idx > canmax:
canmax = num+idx
时间复杂度为O(n)