题目
给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标。
解法一
思路
动态规划
dp[i]表示位置i是否可达,true为可达。
那么dp[i]可以由第j个位置(0..i-1)的位置过来,只要dp[j]可达且i-j<=nums[j]。
代码
class Solution {
public boolean canJump(int[] nums) {
// dp[i]表示是否可达,true可达,false不可达
boolean[] dp = new boolean[nums.length];
dp[0] = true;
for (int i = 1; i < nums.length; i++) {
for (int j = 0; j < i; j++) {
if (dp[j] && (i - j) <= nums[j]) {
dp[i] = true;
continue;
}
}
}
return dp[nums.length - 1];
}
}
复杂度
- 时间复杂度:O(n^2)
- 空间复杂度:O(n)
解法二
思路
贪心法
代码
class Solution {
public boolean canJump(int[] nums) {
int most = 0;
for (int i = 0; i < nums.length; i++) {
if (i <= most) {
most = Math.max(most, i + nums[i]);
}
if (most >= nums.length - 1) {
return true;
}
}
return false;
}
}
复杂度
- 时间复杂度:O(n)
- 空间复杂度:O(1)