Given an array of non-negative integers, you are initially positioned at the first index of the array.
Each element in the array represents your maximum jump length at that position.
Determine if you are able to reach the last index.
For example:
A = [2,3,1,1,4], return true.
A = [3,2,1,0,4], return false.
第一种方法就是动态规划的,利用一个布尔类型的数组装着数组中所有的元素能否到达最后一个元素。不过这种超时了。
超时
// version1: Dynamic Programming
public boolean canJump(int[] nums) {
boolean[] can = new boolean[nums.length];
can[0] = true;
for (int i = 0; i < nums.length; i++)
for (int j = 0; j < i; j++)
if (can[j] && j + nums[j] >= i) {
can[i] = true;
break;
}
return can[nums.length - 1];
}
第二种就是贪心算法,尽可能多放进来呗。这个肯定是AC了。就看这个整个数组能跑多远,如果最远能跑到数组的长度就是true。
// version2: Greedy
public boolean canJump(int[] nums) {
// think it as merging n intervals
if (nums == null || nums.length == 0)
return false;
int farthest = nums[0];
for (int i = 1; i < nums.length; i++) {
if (i <= farthest && nums[i] + i >= farthest)
farthest = nums[i] + i;
}
return farthest >= nums.length - 1;
}