方法一
从后往前找
public int jump(int[] nums) {
int len = nums.length;
nums[len-1] = 0;
for(int i = len - 2; i >= 0; i--){
int min = nums[i+1];
int boundary = Math.min(i + nums[i], len - 1);
for(int j = i + 1; j <= boundary; j++){
if(nums[j] < min){
min = nums[j];
}
}
nums[i] = 1 + min;
}
return nums[0];
}
方法二
从前往后找
public int jump2(int[] nums) {
int len = nums.length;
int step = 0;
//边界,即当前跳跃点能够到达的最远距离
int boundary = 0;
//目前正在访问的点能够到达的最远位置
int maxPosition = 0;
/*
贪心算法,只考虑能跳最远的点
数组从前往后找点,更新maxPosition,
找边界内能够跳的最远的点作为新的跳跃点,步数加一
它能够比边界内所有点都跳的远
*/
for (int i = 0; i < len - 1; i++) {
//如果已经能够到达终点了,就退出循环
if (boundary >= len - 1) {
break;
}
/*
在边界内寻找能够跳的最远的点,更新maxPosition
*/
if (i + nums[i] > maxPosition && i <= boundary) {
maxPosition = i + nums[i];
} else if (maxPosition >= len - 1) {
++step;
break;
}
//当前遍历的点已经到达边界,更新边界
if (i >= boundary) {
boundary = maxPosition;
++step;
}
}
return step;
}