📝 思路(贪心)

核心:每次在能跳到的范围里,选择能到达最远的点。

过程:

  1. 遍历数组,用 end 表示当前这一步能到达的最远位置。

  2. 用 farthest 表示下一步能到达的最远位置。

  3. 当走到 end 时,说明必须要跳了(否则走不下去),跳一次并更新 end = farthest。

  4. 最后统计跳跃次数。

class Solution {
    public int jump(int[] nums) {
        int steps = 0;// 跳跃次数
        int end = 0;// 当前这一步能到的最远位置
        int farthest = 0;// 下一步能到的最远位置

        // 注意:最后一个位置不用遍历,因为跳到最后就结束了
        for(int i = 0; i < nums.length - 1; i++){
            farthest = Math.max(farthest, i + nums[i]);// 能跳到的最远位置
            if(i == end){// 到达了当前这一步的边界,必须跳一次
                steps++;
                end = farthest;// 更新边界
            }
        }
        return steps;
    }
}
// 时间复杂度:O(n)(只需一次遍历)
// 空间复杂度:O(1)(只用几个变量)

更多推荐