跳跃游戏 I 和 II

跳跃游戏I

链接:link

解题思路

  • 使用贪心算法
  • 从数组的第一个元素开始,维护一个变量 m a x P o s i t i o n maxPosition maxPosition,它表示从当前位置开始能够到达的最远位置。
  • 然后,我们遍历数组,对于每个位置 i,当做新的起跳点,如果 i 大于等于 m a x P o s i t i o n maxPosition maxPosition,则无法到达该位置,返回 false。否则,我们更新 m a x P o s i t i o n maxPosition maxPosition 为 max( m a x P o s i t i o n maxPosition maxPosition, i + nums[i]),即取当前位置加上当前位置可以跳跃的最大长度和之前能到达的最远位置中的较大值。
  • 最后,如果 m a x P o s i t i o n maxPosition maxPosition大于等于数组的长度减一(即最后一个下标的索引),则说明可以到达最后一个下标,返回 true;否则,返回 false。
  • 时间复杂度: O ( n ) O(n) O(n),其中 n 是数组长度;空间复杂度: O ( 1 ) O(1) O(1)

代码

 public boolean canJump(int[] nums) {
        int maxPosition = 0, i = 0;
        while(i <= maxPosition) {
            maxPosition = Math.max(i + nums[i], maxPosition);
            if(maxPosition >= nums.length - 1) {
                return true;
            }
            i++;
        }
        return false;
    }

跳跃游戏 II

链接:link

解题思路

  • 使用贪心算法
  • 维护一个变量 m a x P o s i t i o n maxPosition maxPosition,记录在边界范围内,能跳跃的最远位置的下标, m i n S t e p minStep minStep表示需要跳跃的最小次数, b o r d e r border border表示记录当前能跳跃到的位置的边界下标,在此边界内采取跳跃动作时,跳跃次数都得加一,所以统一为到达边界时,更新边界并将跳跃次数增加 1。
  • 然后,我们遍历数组,对于每个位置 i,更新 m a x P o s i t i o n maxPosition maxPosition 为 max( m a x P o s i t i o n maxPosition maxPosition, i + nums[i]),即取 当前位置加上当前位置可以跳跃的最大长度之前能到达的最远位置 中的较大值。
  • 最后,记录 跳跃次数,如果跳到了终点,即 i < n u m s . l e n g t h − 1 i<nums.length-1 i<nums.length1(此处不访问最后一个元素,这是因为在访问最后一个元素之前,我们的边界一定大于等于最后一个位置,否则就无法跳到最后一个位置了)
  • 时间复杂度: O ( n ) O(n) O(n),其中 n 是数组长度;空间复杂度: O ( 1 ) O(1) O(1)

代码

public int jump(int[] nums) {
        int maxPosition = 0, minStep = 0, border = 0;
        for(int i = 0; i < nums.length - 1; i++) {
            maxPosition = Math.max(maxPosition, i + nums[i]);
            if(i == border) {
                border = maxPosition;
                minStep++;
            }
        }
        return minStep;

    }
  • 21
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值