LeetCode 55: Jump Game
算法一思路
(1)假定用start出发,用next记录从[start + 1, end]出发能到达的最远距离;
(2)更新start和end;
(3)如果next和end相等,表明不能继续,返回false;
代码
public class Solution {
public boolean canJump(int[] nums) {
if (nums.length == 1) return true;
int start = 0, end = nums[0], next = end;
while (end < nums.length - 1) {
for (int i = start + 1; i <= end; i++) {
if (i + nums[i] > next) next = i + nums[i];
}
if (next == end) return false;
start = end;
end = next;
}
return true;
}
}
算法二思路
(1)从nums.length - 1 开始,如果 i + nums[i] >= min,表明如果能到达i则一定能到达最后一个索引处;
(2)更新min;
(3)最后min等于0,表示到达0就能到达最后,返回true;
(4)这两种算法的时间复杂度均为O(N).
public class Solution {
public boolean canJump(int[] nums) {
int N = nums.length;
int min = N - 1;
for (int i = N - 2; i >= 0; i--) {
if (i + nums[i] >= min) min = i;
}
return (min == 0);
}
}