【Leetcode】跳跃游戏 | Jump Jump,Greedy Greedy

55 跳跃游戏

给定一个非负整数数组 nums ,你最初位于数组的 第一个下标

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

判断你是否能够到达最后一个下标

  • 不断更新当前能够到达的范围maxReach
class Solution {
    public boolean canJump(int[] nums) {
        int maxReach = 0;
        int i = 0;
        while (i <= maxReach && maxReach < nums.length - 1) {
            maxReach = Math.max(maxReach, i + nums[i]);
            i++;
        }
        return maxReach >= nums.length - 1;
    }
}

45 跳跃游戏Ⅱ

给定一个非负整数数组 nums ,你最初位于数组的 第一个下标

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

求到达数组最后一个下标的最小跳跃次数

【Leetcode】跳跃游戏 | Jump Jump,Greedy Greedy_第1张图片

按跳跃步数访问,当要跳第 i + 1 i+1 i+1步时,在第 i i i步可到达的范围里,记录第 i + 1 i+1 i+1步能跳跃的最远距离。当最远距离达到数组最后一个元素时,跳到了末尾,可结束循环。

class Solution {
    public int jump(int[] nums) {
        int count = 0;

        // 当前最远可以跳到什么地方,下一步最远可以跳到什么地方
        int maxReach = 0;
        int nextReach = 0;
        // 当前位置
        int i = 0;

        // 当跳跃count步,但未到达终点时,第count步的可达范围为[i, maxReach]
        while (maxReach < nums.length - 1) {
            
            // 看看跳count + 1步最远能够跳到哪里,更新nextReach
            while (i <= maxReach) {
                nextReach = Math.max(nextReach, i + nums[i]);
                i++;
            }
            
            // 上面循环结束时,i = maxReach + 1
            // 第count + 1步可达范围[i, nextReach]
            maxReach = nextReach;
            count++;
        }

        return count;
    }
}

你可能感兴趣的:(Leetcode题解总结,leetcode,算法)