给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。
示例 1:
输入: [2,3,1,1,4]
输出: true
解释: 从位置 0 到 1 跳 1 步, 然后跳 3 步到达最后一个位置。
示例 2:
输入: [3,2,1,0,4]
输出: false
解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。
这道题是刚刚做的,可以用贪心的思路。
我分享这道题的原因是因为它更适合反过来想。我们可以从数组的倒数第二个个元素看起,每次往前遍历,如果当前的元素能够到达最后一个位置,那么我们把当前位置开始到最后全部“切断”,以当前元素为最后一个元素,重复第一次的过程就好了。而最后,如果我们遍历到数组的第一个元素,那么此题返回true,否则,你懂得。
话说再少都嫌多,上代码才是王道:
func canJump(nums []int) bool {
l := len(nums) - 1
for i := l-1; i >=0 ; i-- {
if nums[i]+i >= l {
l = i
}
}
return l <= 0
}
代码不长,应该就不用注释了。其实这次的代码整体来说我是比较满意的。因为时间复杂度O(n)应该是最少了,然后代码量也比别人的少一些哈哈。继续努力咯~
算法梦想家,来跟我一起玩算法,玩音乐,聊聊文学创作,咱们一起天马行空!
有疑问加站长微信联系(非本文作者)