给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标。
- 示例
输入:nums = [2,3,1,1,4]
输出:true
解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。
思路
- 设定一个
dp
数组,dp[i]
表示在下标i处能够跳跃的最大值。 - 对于
dp[i]
,它等于dp[i-1]
跳一格到达i处后剩余的步数 和nums[i]
的最大值。因此得出状态转移方程为:dp[i]=max(dp[i-1]-1,nums[i])
- 边界条件:
dp[0]=nums[0]
- 在每次循环开始,我们判断
dp[i-1]
是否等于0,若是,则不可能到达下标i处,因此直接返回false。循环结束后返回true - 因为转移状态数组
dp
只和前一位有关,因此可以用滚动数组简化空间复杂度
- 代码
public boolean canJump1(int[] nums) {
//dp[i]表示在下标i处能跳跃的最大值
int a = nums[0]; //dp[i-1]
int b = 0; //dp[i]
for (int i = 1; i < nums.length; i++) {
if (a==0)
return false;
b = Math.max(a-1,nums[i]);
a = b;
}
return true;
}