跳跃游戏 II

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

你的目标是使用最少的跳跃次数到达数组的最后一个位置。

示例:

输入: [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
说明:

假设你总是可以到达数组的最后一个位置。

(1)
方法:贪婪算法
思路:很简单,从数组开头开始,拿到下个坐标开始到nums[i]坐标区间中能走的最远距离的坐标,通俗点儿就是拿到拿到k从i + 1坐标到i + nums[i]中 k + nums[k]最大时的k值,然后把k值赋给i,并且步数加一,并开始下一轮循环,直到i + nums[i] >= nums.length - 1,说明再走一步就走完数组了,此时步数再加一返回就是答案;

class Solution {
    public int jump(int[] nums) {
        if (nums .length < 2)
            return 0;
        int i = 0, j = 0, len = nums.length;//记录当前坐标和元素
        int count = 0;//结果
        while (i < len) {
            if (i + nums[i] >= len - 1) {//已经超出或者刚好满足
                count ++;
                return count;
            }
            int temp = -1;
            for (int k = i + 1; k <= i + nums[i]; k ++) {
                if (temp < k + nums[k]) {//拿到没一次课跳最远的坐标
                    temp = k + nums[k];
                    j = k;
                }
            }
            i = j;
            count ++;
        }
        return 0;
    }
}

(2)
改进:思路差不多,只是直接遍历数组,每次都拿到当前下标i元素能走到的最远距离,当最远距离小于i时,说明走不到了,那么就需要跳,则步数加一,并且拿到前面元素中所能走到的最远距离,继续后续判断,看能在这个距离内否走完全部数组;

class Solution {
    public int jump(int[] nums) {
        int reachable = 0;
        int next = 0;
        int jump = 0;
        for (int i = 0; i < nums.length; i++){
            if (reachable < i){
                jump++;
                reachable = next;//如果不能到达,证明需要多跳一步,reachable就更新为前面节点所能到达的最远位置
            }
            next = Math.max(next,i+nums[i]);//当前i节点最远能reach的位置
        }
        return jump;

    }
}

猜你喜欢

转载自blog.csdn.net/weixin_42156844/article/details/83993771