题目描述:给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃
的最大长度。判断你是否能够到达最后一个位置。
1、暴力解法(超时)
boolean flag = false;
public void jump(int[] nums, int start)
{
int newStart = 0;
if (start > nums.length-1)
return;
if (start == nums.length-1) // 到达了最后一个位置
flag = true;
for (int i=1; i<=nums[start]; i++)
{
newStart = start + i; // 这里不能改变start的值
jump(nums, newStart);
}
}
public boolean canJump(int[] nums)
{
jump(nums, 0);
return flag;
}
优化后(备忘录),还是超时
boolean flag = false;
int[][] memo = null; // 备忘录
boolean satisfy = true;
public void jump(int[] nums, int start)
{
int newStart = 0;
if (start > nums.length-1)
return;
if (start == nums.length-1) // 到达了最后一个位置
{
flag = true;
satisfy = false; // 找到一个满足条件的解就结束
return;
}
for (int i=1; i<=nums[start] && satisfy; i++)
{
if (memo[start][i] != 0) // 表示该状态已经算过
continue;
memo[start][i] = start + i; // 这里不能改变start的值
jump(nums, memo[start][i]);
}
}
public boolean canJump(int[] nums)
{
int maxVal = Integer.MIN_VALUE;
for (int i=0; i<nums.length; i++)
{
maxVal = maxVal > nums[i] ? maxVal : nums[i];
}
// 初始化备忘录
memo = new int[nums.length][maxVal+1]; // 默认值是0
jump(nums, 0);
return flag;
}