package leetcode;
public class canJump55 {
public static void main(String[] args) {
//int[] nums = {2,3,1,1,4};
int[] nums = {1,1,2,2,0,1,1};
//实现方案A
System.out.println(canJump(nums));
}
public static boolean canJumpB(int[] nums) {
int hat = 0 ;
int j = nums.length-1;
for (int i = 0; i < nums.length; i++) {
//找出当前步向前跳范围内,能跳的最远的下标
int a = i+nums[i];
if(a>hat){
hat = a;
}
if(hat>=j){
return true;
}
if (hat <= i) {
return false;
}
}
return false;
}
/**
* 从数组第一位调到最后一位
* 数组里的数是向前可以跳的步数
* @param nums
* @return
*/
public static boolean canJump(int[] nums) {
int tag = 0 ;
for (int i = 0; i < nums.length; i++) {
//找出当前步向前跳范围内,能跳的最远的下标
tag = getTag(tag,nums);
if (tag == -1) {
return false;
}
if (tag == nums.length-1) {
return true;
}
}
return false;
}
private static int getTag(int tag, int[] nums) {
//如果能直接跳到终点 就直接返回中点
if (nums[tag] >= nums.length-1-tag) {
return nums.length-1;
}
//如果跳的最远的为0 说明跳不了了 直接返回-1表示
if (nums[tag]==0) {
return -1;
}
//如果是一个就直接返回不用比较
if (nums[tag]==1) {
return tag+1;
}
int max =tag+1;
//判断范围内能跳的最远的下一个
for (int i = tag+2; i <= tag+nums[tag]; i++) {
//比较出个最大的
if (nums[max] < nums[i] + (i-max)) {
max = i;
}
}
return max;
}
}