Leetcode.45 跳跃游戏 II

题目链接

Leetcode.45 跳跃游戏 II mid

题目描述

给定一个长度为 n0 索引整数数组 nums。初始位置为 nums[0]

每个元素 nums[i]表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i]处,你可以跳转到任意 nums[i + j]处:

  • 0 < = j < = n u m s [ i ] 0 <= j <= nums[i] 0<=j<=nums[i]
  • i + j < n i + j < n i+j<n

返回到达 nums[n - 1]的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]

示例 1:

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

示例 2:

输入: nums = [2,3,0,1,4]
输出: 2

提示:
  • 1 < = n u m s . l e n g t h < = 1 0 4 1 <= nums.length <= 10^4 1<=nums.length<=104
  • 0 < = n u m s [ i ] < = 1000 0 <= nums[i] <= 1000 0<=nums[i]<=1000
  • 题目保证可以到达 nums[n-1]

解法:贪心

c u r cur cur 表示当前选择的跳跃位置的终点。

n x t nxt nxt 表示下一个跳跃位置的终点。

如果当前位置 i = c u r i = cur i=cur就表示,当前的 一跳 已经到达终点,所以要选择 下一跳 了。答案 a n s + = 1 ans += 1 ans+=1 c u r cur cur 更新为 n x t nxt nxt

时间复杂度: O ( n ) O(n) O(n)

C++代码:

class Solution {
public:
    int jump(vector<int>& nums) {
        int n = nums.size();
        int ans = 0;
        
        int cur = 0 , nxt = 0;
        for(int i = 0;i < n;i++){
            //nxt 更新为能到达的最远位置
            nxt = max(nxt,i + nums[i]);
            //i == cur 时,说明 当前跳 的距离已经用光了 ,需要选择 下一跳 了
            // i != n -1 是因为我们要记录的是 跳数  不是跳的过程中经过的结点数,所以当 i==cur 并且 i 是最后一个
            //位置时,我们不做处理
            if(i == cur && i != n - 1){
                ans++;
                cur = nxt;
            }
        }

        return ans;
    }
};

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值