【代码随想录】跳跃游戏 II

40 阅读1分钟

跳跃游戏 II

规则同跳跃游戏,但要输出的是最少跳跃次数。

之前那种思路仍然可行,我们的领域就是靠一步一步对应拓展的,虽然可以考虑到有些进展慢的路线并不会落在新增区间内,但那并不影响,因为我们求的是最快路线。

我先是稍微修改了一下之前的代码,发现不行

class Solution {
    public int jump(int[] nums) {
        if(nums.length <= 1) return 0;
        int reach = nums[0];
        int pre = 0;
        int count = 1;
        while(reach < nums.length - 1 && !(reach == pre)) {
            pre = reach;
            count++;
            for (int i = 0; i <= reach; i++) {
                if(reach >= nums.length - 1) return count;
                if(i + nums[i] > reach) reach = i + nums[i];
            }
        }
        return count;
    }
}

我意识到之前并不是按照一步一步来推进的,和我的设想有出入,我的reach在往前迈一步的一次遍历中就会有变化,但是因为之前讨论的是能否到达所以这一点被掩盖了,而且看起来反而是一种优化🤗

那么我们就把每一次的reach定格一下好了。

class Solution {
    public int jump(int[] nums) {
        if(nums.length <= 1) return 0;
        int reach = nums[0];
        int pre = 0;
        int count = 1;
        while(reach < nums.length - 1 && !(reach == pre)) {
            pre = reach;
            count++;
            int temp = reach;
            for (int i = 0; i <= temp; i++) {
                if(reach >= nums.length - 1) return count;
                if(i + nums[i] > reach) reach = i + nums[i];
            }
        }
        return count;
    }
}

暂时想不到如何进一步优化,看看解析,我发现之前跳跃 I 的解法就可以进一步优化(当时没注意

class Solution {
    public int jump(int[] nums) {
        if(nums.length <= 1) return 0;
        int reach = nums[0];
        int temp = reach;
        if(nums.length <= reach + 1) return 1;
        int count = 2;
        for (int i = 0; i < nums.length; i++) {
            if(i == temp + 1) {
                count++;
                temp = reach;
            }
            if(i <= temp) {
                reach = Math.max(reach, i + nums[i]);
                if (reach >= nums.length - 1) return count;
            }
        }
        return count;
    }
}