0%

LeetCode.55.跳跃游戏(中等)

题目

LeetCode.55.跳跃游戏(中等)

给定一个非负整数数组 nums ,你最初位于数组的 第一个下标
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标。

题解

到达最后一个下标需要什么条件?

跳过的长度要大于等于数组长度

什么情况下不能到达最后一个下标?

到达某个位置后,不继续往后跳了,比如到了某个位置,可跳跃长度为0,就不会往后跳了,跳到最后一个位置就无从谈起。

我怎么知道总共跳跃的长度有没有超过数组的长度?

只能从头到尾遍历数组,记录最多能跳多远,会不会在某个位置停止跳跃,如果不会停止跳跃,肯定能跳到终点。

停止跳跃有什么特征?怎么判断有没有停止跳跃?

如果记录最远能够跳到的位置,停止跳跃的时候,记录的位置不会再改变了。
在遍历数组检查最多能跳多远的时候,如果发现数组当前遍历的下标超过记录的最远跳过的位置,说明跳跃停止了。因为遍历数组相当于每次跳1步,是最低速度,如果能持续跳跃,不会低于这个速度,最低也是持平。

代码

1
2
3
4
5
6
7
8
9
10
11
class Solution {
fun canJump(nums: IntArray): Boolean {
var j = 0
for (i in nums.indices) {
if (i > j) return false
j = maxOf(j, i + nums[i])
if (j >= nums.size) return true
}
return true
}
}