【力扣】55. 跳跃游戏 & 45. 跳跃游戏 II

题目:55. 跳跃游戏

解题思路

  • 使用数组中指定的移动距离 判断 元素能否移动到数组末尾,即判断当前可移动的最大值能否超过数组长度
  • 设置maxRange用于记录当前能够移动的最大距离,当maxRange>nums.length时,则可以返回true
  • for循环:使用变量i,通过移动变量i,来更新maxRange的值【maxRange = Math.max(maxRange, i+nums[i])】
  • 为何要设置【i<=maxRange】?由于maxRange是当前遍历的最长数组,所以当使用变量i进行遍历时,需要控制其遍历的范围不超过当前可移动的最大范围。

Java代码实现

class Solution {
    public boolean canJump(int[] nums) {
        if(nums.length == 1){
            return true;
        }

        // 使用maxRange控制可移动的最远位置
        int maxRange = 0;
        for(int i=0; i<=maxRange ; i++){
            maxRange = Math.max(maxRange, i+nums[i]);
            if(maxRange > nums.length){
                return true;
            }
        }
        return false;
    }
}

参考资料:55. 跳跃游戏


题目:45. 跳跃游戏 II

解题思路

  • 题目要求:使用数组中指定的移动距离 返回 移动到数组末尾 的最小可移动次数,即返回移动的最小次数【设置变量result】
  • 设置end用于记录当前能够移动的最大距离,设置变量temp用于记录下一步能够移动的最大距离;遍历到 i=end 时,说明已遍历到当前能够移动的最大距离,更新end值,同时result++,说明移动次数需要增加1;
  • for循环:使用变量i,通过移动变量i,来更新 temp 和 end 的值【temp = Math.max(temp, i+nums[i])】
  • 为何要设置【i<=end && end<nums.length-1】?由于 end 是当前遍历的最长数组,所以当使用变量 i 进行遍历时,需要控制其遍历的范围不超过当前可移动的最大范围。同时,当 end 已经遍历到数组末尾了,说明已经到达终点了。

Java代码实现

class Solution {
    public int jump(int[] nums) {
        // 使用res记录需要几步,end表示当前能够覆盖的最大范围,temp下一步覆盖的最远范围
        int result = 0;
        int end = 0;
        int temp = 0;

        for(int i=0; i<=end && end<nums.length-1; i++){
            // 更新temp,用于记录下一步能够覆盖的最大范围
            temp = Math.max(temp, i+nums[i]);
            // 当i递增到end时,说明,当前的最大值未更新,则更新end,并且将res值+1
            if(i == end){
                end = temp;
                result++;
            }
        }
        return result;
    }
}

参考资料:45. 跳跃游戏Ⅱ

posted @ 2023-04-12 17:35  是你亦然  阅读(27)  评论(0)    收藏  举报