45. 跳跃游戏II

贪心

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/

posted @ 2022-02-25 17:16  振袖秋枫问红叶  阅读(34)  评论(0)    收藏  举报