解答一
java
class Solution {
public boolean canJump(int[] nums) {
if (nums == null || nums.length == 0) {
return false;
}
if (nums[0] == 0 && nums.length == 1) {
return true;
}
return canJump(nums, 0);
}
public boolean canJump(int[] nums, int index) {
if (index > nums.length - 1) {
return false;
}
if (nums[index] == 0) {
return false;
}
if (nums[index] + index >= nums.length - 1) {
return true;
}
// for (int i = 1; i <= nums[index]; ++i) {
for (int i = nums[index]; i > 0; --i) {
if (canJump(nums, index + i)) {
return true;
}
}
return false;
}
}
解答二
java
class Solution {
public boolean canJump(int[] nums) {
int max = 0;
for (int i = 0; i < nums.length && i <= max; i++) {
max = Math.max(max, i + nums[i]);
if (max >= nums.length - 1) {
return true;
}
}
return false;
}
}
总结
解答一使用递归,可以解决问题,但当输入规模增大时,可能出现递归过多、栈溢出的现象,同时效率也不满足要求。
解决二使用贪心算法,简单、直接、暴力、有效。变量max
的使用,值得深入理解。