贪心
class Solution {
public int jump(int[] nums) {
/**
* 如果只有一个元素,那不用走
*/
if (nums.length == 1){
return 0;
}
/**
* curMax记录在第i个元素能走到的最远距离
* max记录在curMax这段距离中,选择任意一个点可能达到的最大距离
*/
int curMax = 0;
int max = 0;
int step = 0;
for (int i = 0; i < nums.length; i++) {
/**
* 在遍历curMax这段距离中,实时更新可能的最大值
*/
max = Math.max(max, i + nums[i]);
/**
* 如果curMax遍历完了,发现最大距离已经到终点了,说明在curMax这段距离中必然有一个点可以直接到终点
* 因此只需要再走一步就能到终点
*/
if (i == curMax){
if (max >= nums.length - 1){
step++;
break;
}
/**
* 如果最大距离还没到终点,说明在curMax内走任意哪个点都是不够的,因此步数先加1,还要继续往前走
* 此时curMax范围扩大为max,然后继续遍历新curMax这段距离
*/
else {
curMax = max;
step++;
}
}
}
return step;
}
}
/**
* 时间复杂度 O(n)
* 空间复杂度 O(1)
*/
优化1——简化判断流程
class Solution {
public int jump(int[] nums) {
/**
* curMax记录在第i个元素能走到的最远距离
* max记录在curMax这段距离中,选择任意一个点可能达到的最大距离
*/
int curMax = 0;
int max = 0;
int step = 0;
for (int i = 0; i < nums.length - 1; i++) {
/**
* 在遍历curMax这段距离中,实时更新可能的最大值
*/
max = Math.max(max, i + nums[i]);
/**
* 如果curMax没到终点,说明在curMax内只走一步是不够的,步数加1,还要继续往前走。然后curMax扩大成max,继续遍历新的curMax这段距离
* 如果curMax已经到达终点了,那就不用走了;但最后i遍历到终点时肯定满足if条件,step会多加一次
* 因此i只需要遍历到倒数第二个元素即可,这样如果curMax为终点,那就永远不会执行这一步判断,也就不会多加一次了
* 这样也不用单独判断数组长度为1的情况了(类似《55. 跳跃游戏》)
*/
if (i == curMax){
curMax = max;
step++;
}
}
return step;
}
}
/**
* 时间复杂度 O(n)
* 空间复杂度 O(1)
*/
https://leetcode-cn.com/problems/jump-game-ii/