给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。
package com.leetcode.july;
/**
* @author jiayoo
* 2018 / 7 / 23
* 给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。
*
* 分类为贪心算法 难度 中等
* https://leetcode-cn.com/problems/jump-game/description/
*
*
*
*/
public class Demo3 {
public static void main(String[] args) {
Demo3 d3 = new Demo3();
int[] a = {2,3,1,1,4};
int[] b = {3,2,1,0,4};
System.out.println(d3.canJump(a));
System.out.println(d3.canJump(b));
}
public boolean canJump(int[] nums) {
if(nums.length == 1) { // 先判断特殊取值
return true;
}
int i, len, max, left ;
len = nums.length; // 获得长度
left = len ; // 记录剩余的长度
max = nums[0]; //为可跳跃长度
/*
*
* 1.先判断当前位置的值, 是否直接符合要求
* 2.判断当前位置的值是否合法, 如果max已经是0了 且不是最后一位 直接返回错误
* 3. 当前位置最大能跳减一 , 因为前面已经判断了 max >= 1, 所以拿后一位的值跟它比较
* 重复前面的操作即可。
*
* */
for (i = 1; i < len; i++) {
left = len - i;
if (max >= left) { // 可调越长度符合要求
return true;
}
if (max <= 0) {
return false;
}
max--;
if (max < nums[i]) { //更新max值
max = nums[i];
}
}
return false;
}
}