leetcode-45:跳跃游戏 II

简介: leetcode-45:跳跃游戏 II

题目

题目链接

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

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

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

假设你总是可以到达数组的最后一个位置。

示例 1:

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

示例 2:

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

解题

方法一:回溯

更加推荐第一种写法,思路比较清晰。

本题的思路就是获取每一步的范围

上图例子中,在i=0时,走第一步,res=1

i=2时,第一步走完,准备走第二步, res=2

i=4时,第二步走完,并步打算走第三步(对于终点要特殊情况考虑)if(i!=nums.size()-1) ,否则的话res=3就不符合题意了

class Solution {
public:
    int jump(vector<int>& nums) {
        int curDistance=0;
        int nextDistance=0;
        int res=0;
        for(int i=0;i<nums.size();i++){
            nextDistance=max(nextDistance,i+nums[i]);
            if(curDistance==i){
                if(i!=nums.size()-1){// 如果当前覆盖最远距离下标不是终点,因为到达终点了就没必要res++了
                    curDistance=nextDistance;
                    res++;
                }
            }
        }
        return res;
    }
};

这里是为了上面的 对于终点的情况,要特殊考虑,进行了简化。

索引i只需要走到nums.size()-2就行了

  • 如果移动下标等于当前覆盖最大距离下标, 需要再走一步
  • 如果移动下标不等于当前覆盖最大距离下标,说明当前覆盖最远距离就可以直接达到终点了,不需要再走一步
class Solution {
public:
    int jump(vector<int>& nums) {
        int CurDistance=0;
        int NextDistance=0;
        int res=0;
        for(int i=0;i<nums.size()-1;i++){ //nums.size()-1是关键
            NextDistance=max(i+nums[i],NextDistance);
            if(i==CurDistance){
                CurDistance=NextDistance;
                res++;
            }
        }
        return res;
    }
};

java

class Solution {
    public int jump(int[] nums) {
        int curDistance=0;
        int nextDistance=0;
        int k=0;
        for(int i=0;i<nums.length-1;i++){
            nextDistance=Math.max(nextDistance,i+nums[i]);
            if(i==curDistance){
                k++;
                curDistance=nextDistance;
            }
        }
        return k;
    }
}

相关文章
|
30天前
|
算法
Leetcode第45题(跳跃游戏II)
这篇博客文章讨论了如何使用贪心算法解决LeetCode第45题“跳跃游戏II”,目的是找到使用最少跳跃次数到达数组末尾的策略。
70 8
Leetcode第45题(跳跃游戏II)
|
3月前
|
算法
LeetCode第55题跳跃游戏
LeetCode第55题"跳跃游戏"的解题方法,通过记录当前最远可达到的位置并判断每个位置是否可达以及能否到达末尾,有效解决了跳跃至数组末尾的可行性问题。
LeetCode第55题跳跃游戏
|
30天前
Leetcode第55题(跳跃游戏)
LeetCode第55题“跳跃游戏”要求判断在一个非负整数数组中,从第一个位置出发,是否能够到达最后一个位置,其中每个位置的元素代表可跳跃的最大长度。
26 0
|
3月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
48 1
|
3月前
|
Python
【Leetcode刷题Python】174. 地下城游戏
LeetCode 174题 "地下城游戏" 的Python解决方案,使用动态规划算法计算骑士从左上角到右下角拯救公主所需的最低初始健康点数。
48 3
|
3月前
|
算法 索引 Python
【Leetcode刷题Python】55. 跳跃游戏
解决LeetCode "跳跃游戏"问题的Python实现代码,使用了贪心算法的思路。代码中初始化最远可到达位置 max_k,并遍历数组 nums,通过更新 max_k 来记录每次能跳到的最远位置,如果在任何时刻 max_k 大于或等于数组的最后一个索引,则返回 True,表示可以到达数组的末尾;如果当前索引 i 超出了 max_k,则返回 False,表示无法继续前进。时间复杂度为 O(n),空间复杂度为 O(1)。
47 1
|
3月前
|
算法
LeetCode第45题跳跃游戏 II
LeetCode第45题"跳跃游戏 II"的解题方法,通过一次循环和选择每个位置的最大可跳距离,有效减少了跳跃次数,简化了问题。
|
5月前
|
算法
力扣经典150题第三十八题:生命游戏
力扣经典150题第三十八题:生命游戏
36 0
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
3月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
107 2