1、题目描述
https://leetcode-cn.com/problems/jump-game/
类似题:1024. 视频拼接(贪心、DP)https://blog.csdn.net/IOT_victor/article/details/109264503
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。
2、代码详解
法一:巧妙,greedy
如果一个位置能够到达,那么这个位置左侧所有位置都能到达。(因为跳的长度可以任意,只要小于最大长度)
解题思路:
- 如果某一个作为 起跳点 的格子可以跳跃的距离是 3,那么表示后面 3 个格子都可以作为 起跳点。
- 可以对每一个能作为 起跳点 的格子都尝试跳一次,把 能跳到最远的距离 不断更新。
- 如果可以一直跳到最后,就成功了。
class Solution(object):
def canJump(self, nums):
k = 0 # 能跳到最远的距离
for i in range(len(nums)):
if i > k: # 表明最远也无法跳到第i位
return False
k = max(k, i + nums[i]) # 看最远能到哪
return True
nums = [3,2,1,0,4]
s = Solution()
print(s.canJump(nums))
法二:动态规划 O(n^2)超时
class Solution(object):
def canJump(self, nums):
dp = [True] * len(nums)
dp[0] = True
for j in range(1, len(nums)):
dp[j] = False
# 从 i 跳到 j
for i in range(j):
if dp[i] == True and i + nums[i] >= j:
dp[j] = True
break # 任意一种情况满足即可
return dp[len(nums)-1]