给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。
示例 1:
输入: [2,3,1,1,4]
输出: true
解释: 从位置 0 到 1 跳 1 步, 然后跳 3 步到达最后一个位置。
示例 2:
输入: [3,2,1,0,4]
输出: false
解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。
本题中如果数组长度为1,即便这个数是0,也会认为可以到达,返回true
public class Solution {
public static boolean canJump(int[] nums) {
int i,j,max,t = 0;
int n = nums.length;
if(n==1)
{
return true;
}
if(n!=1&&nums[0]==0)
{
return false;
}
for(i=0;i<n-1;)
{
max = -10000;
if(nums[i]+i>=n-1)
{
return true;
}
for(j=i+1;j<=i+nums[i]&&j<n;j++) //判断当前点可以到达的范围
{
if(nums[j]+j>=max) //在可到达的范围中选择离终点最近的位置,即考虑所有点的nums值以及其所在的位置两个因素
{
max = nums[j]+j;
t = j;
}
if(j==n-1)
{
return true;
}
}
if(max==-10000)
{
break;
}
i = t;
max = nums[i];
if(max==0)
{
break;
}
}
return false;
}
public static void main(String[] args)
{
//int[] a = {2,3,1,1,4};
int[] a = {3,2,1,0,4};
//int[] a = {1,1,1,0};
//int[] a = {1,1,2,2,0,1,1};
System.out.println(canJump(a));
}
}