这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战
55. 跳跃游戏
给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标。
示例 1:
输入:nums = [2,3,1,1,4] 输出:true 解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。 示例 2:
输入:nums = [3,2,1,0,4] 输出:false 解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。
解题思路
- 对于已经在i下标的,最多可以跳i+nums[i]的距离
- 我们可以维护一个变量l,代表在遍历前i-1个位置的情况下,最多可以跳多远
- 如果当前遍历的i小于l,说明当前i是不可达的,既然当前i不可达,那么就没有办法跳得更远,因此就不可能到达最后一个下标.在遍历的过程中,如果 目前可以到达的位置 大于等于数组中的当前遍历的位置,那就说明当前位置可达,可以继续遍历。反之,如果当前位置就是不可达的,我们就返回 False 作为答案。如果可以遍历完所有元素,则是说明最后一个元素是可达的。
对于示例2: [3, 2, 1, 0, 4]
-
我们一开始在位置 0,可以跳跃的最大长度为 3,因此最远可以到达的位置被更新为 3;
-
我们遍历到位置 1,由于 1≤3,因此位置 1 可达,加上它可以跳跃的最大长度 2 得到 3,没有超过最远可以到达的位置,所以最远距离还是3;
-
位置 2、位置 3 同理,最远可以到达的位置不会被更新;
-
我们遍历到位置 4,由于4>3,因此位置 4 不可达,我们也就不考虑它可以跳跃的最大长度了。
代码
class Solution {
public boolean canJump(int[] nums) {
boolean[] check=new boolean[nums.length];
int l=0;
for (int i=0;i<nums.length;i++)
{
if (i>l)
return false;
l= Math.max(l,i+nums[i]);
}
return true;
}
}