跳跃游戏 题目链接
题目思路 我们从倒数第二个数开始倒序遍历, 先设置初始要走的步数为n=1,当我们可以走的步数小于n的时候n+1, 当步数够用时候我们再把n还原到1,最后再在0点判断他是否步数为1
go解法 方法一 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 func canJump (nums []int ) bool { n := 1 for i := len (nums) - 2 ; i >= 0 ; i-- { if nums[i] >= n { n = 1 } else { n++ } if i == 0 && n != 1 { return false } } return true }
方法二 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 func canJump (nums []int ) bool { if len (nums) == 1 { return true } max := nums[0 ] for i := 0 ; i < len (nums)-1 ; i++ { max-- if max < 0 { return false } if nums[i] > max { max = nums[i] } } if max < 1 { return false } return true }
方法三 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 func canJump3 (nums []int ) bool { m := len (nums) dp := make ([]int , m) dp[0 ] = nums[0 ] - 1 for i := 1 ; i < m-1 ; i++ { if nums[i] >= dp[i-1 ] { dp[i] = nums[i] } else { dp[i] = dp[i-1 ] } dp[i]-- if dp[i] < 0 { return false } } if dp[0 ] < 0 && m != 1 { return false } return true }