- 思路
一种想法就是求出每个位置的最大跳跃位置,当遇到当前位置的最大跳跃位置出现0时(且不是最后一个位置),说明达不到最后,若中间某个位置的最大跳跃位置大于等于最后一个位置,则说明能够满足。
想到采用动态规划的思路:其实很好想,就是看剩余的步数它能跳到哪里。
func max(a, b int) int {
if a >= b {
return a
}
return b
}
func canJump(nums []int) bool {
// 题目中已经说了nums长度至少为1
nLen := len(nums)
if nLen == 1 {
return true
}
dp := make([]int, nLen)
dp[0] = nums[0]
for i := 1; i < nLen; i++ {
// 若前一个已经是0,那么就走不到当前下标,返回false
if dp[i - 1] == 0 {
return false
}
// 记录当前能走的最大步数
dp[i] = max(dp[i - 1] - 1, nums[i])
}
return true
}