• 【LeetCode-贪心】跳跃游戏 II


    题目描述

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

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

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

    示例:

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

    说明: 假设你总是可以到达数组的最后一个位置。
    题目链接: https://leetcode-cn.com/problems/jump-game-ii/

    思路

    假设当前能起跳的范围为 [left, right),left 初始化为 0, right 初始化为 1,当前已经跳了 steps 步。则我们在 [left, right) 范围内起跳,记录能跳到的最远距离 rightMost,然后将 left 更新为 right+1,right 更新为 rightMost,并且 steps++。

    图来自这篇题解

    代码如下:
    [left, right) 范围内起跳:

    class Solution {
    public:
        int jump(vector<int>& nums) {
            int left = 0;
            int right = 1;
            int steps = 0;
            while(right<nums.size()){ // 因为起跳范围不包括right,所以是right<nums.size()
                int rightMost = left;
                for(int i=left; i<right; i++){
                    rightMost = max(rightMost, i+nums[i]);
                }
                left = right;
                right = rightMost+1;  // 是 rightMost+1,不是 rightMost
                steps++;
            }
            return steps;
        }
    };
    

    也可以在[left, right]范围内起跳:

    class Solution {
    public:
        int jump(vector<int>& nums) {
            int left = 0;
            int right = 0;
            int steps = 0;
            while(right<nums.size()-1){
                int rightMost = 0;
                for(int i=left; i<=right; i++){
                    rightMost = max(rightMost, i+nums[i]);
                }
                left = right+1;
                right = rightMost;
                steps++;
            }
            return steps;
        }
    };
    
    • 时间复杂度:O(n^2)
    • 空间复杂度:O(1)

    参考

    https://leetcode-cn.com/problems/jump-game-ii/solution/45-by-ikaruga/

  • 相关阅读:
    51nod 1031+斐波那契和杨辉三角的一些基础知识
    51nod 1297
    萌新二叉树学习笔记
    HDU3415【单调队列】
    萌新瞎讲网络流之最大流【不定期更新理解篇】
    萌新浅谈单调队列
    51nod 1021【区间DP】
    51nod 1278【贪心】
    51nod 1413
    51nod1181【素数筛】
  • 原文地址:https://www.cnblogs.com/flix/p/13542008.html
Copyright © 2020-2023  润新知