LeetCode动态规划—跳跃游戏从跳到头到跳最少下跳到头(45、55)

简介: LeetCode动态规划—跳跃游戏从跳到头到跳最少下跳到头(45、55)

跳跃游戏


一个下标对应的值为3,那证明这个位置可以跳到前后3个位置的下标处。(±3均可达)

如果依次遍历完这个数组,有下标在跳跃过程中最远位置仍然不可达,即证明无法到达最后一个位置。

可以对每一个能作为 起跳点 的格子都尝试跳一次,把 能跳到最远的距离 不断更新

如果可以一直跳到最后,就成功了

class Solution {
public:
    bool canJump(vector<int>& nums) {
        // vector<int> res()
        int length = nums.size()-1;
        if(length == 0)
            return true;
        int max_index = 0;
        for(int i = 0;i < length;i++)
        {
            if(max_index < i)
                return false;;
            max_index = max(nums[i]+i,max_index);
            if(max_index >= length)
                return true;
        }
        return false;
    }
};


跳跃游戏Ⅱ


分析跳跃到最远位置会依赖于之前跳跃的位置及下标,应该从左到右进行更新,所以不用考虑回退问题。

参考基础的跳跃游戏,Ⅱ是基于一定可跳到最远处进行的最少次数求解问题。

c78c02d5ec3b48b39c992e978882f4c7.png

一个下标对应的值为3,如果从当前下标起跳叫做第1次跳跃,那么从后面3个下标位置起跳都可以叫做第2次跳跃。

所以,当一次跳跃结束时,从下一个位置开始,到当前下标±3的位置(即最远的距离),都是下一次跳跃的范围(4~6)。

微信截图_20230519015406.png

那我们可以遍历从4~6的位置尝试跳跃,直到试探到最远的位置,记录到max_index7。


跳完一次之后,更新下一次可以跳跃的范围(当前下标4~最远位置end6)。

直到跳到当前的范围边界end,此时更新范围边界,end=max_index。

在新的范围内跳,更新能跳到最远的距离max_index。

记录跳跃次数,如果跳到了终点,就得到了结果。

class Solution {
public:
    int jump(vector<int>& nums) {
        int length = nums.size();
        if(length == 1)
            return 0;
        int min_step = 0;
        int max_index = 0;
        int end = 0;
        for(int i = 0;i < length-1;i++)
        {
            max_index = max(nums[i] + i,max_index);
            if(i == end)
            {
                end = max_index;
                min_step++;
            }
        }
        return min_step;
    }
};
相关文章
|
1月前
|
算法
Leetcode第45题(跳跃游戏II)
这篇博客文章讨论了如何使用贪心算法解决LeetCode第45题“跳跃游戏II”,目的是找到使用最少跳跃次数到达数组末尾的策略。
77 8
Leetcode第45题(跳跃游戏II)
|
3月前
|
算法
LeetCode第55题跳跃游戏
LeetCode第55题"跳跃游戏"的解题方法,通过记录当前最远可达到的位置并判断每个位置是否可达以及能否到达末尾,有效解决了跳跃至数组末尾的可行性问题。
LeetCode第55题跳跃游戏
|
1月前
Leetcode第55题(跳跃游戏)
LeetCode第55题“跳跃游戏”要求判断在一个非负整数数组中,从第一个位置出发,是否能够到达最后一个位置,其中每个位置的元素代表可跳跃的最大长度。
29 0
|
3月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
50 1
|
3月前
|
Python
【Leetcode刷题Python】174. 地下城游戏
LeetCode 174题 "地下城游戏" 的Python解决方案,使用动态规划算法计算骑士从左上角到右下角拯救公主所需的最低初始健康点数。
52 3
|
3月前
|
算法 索引 Python
【Leetcode刷题Python】55. 跳跃游戏
解决LeetCode "跳跃游戏"问题的Python实现代码,使用了贪心算法的思路。代码中初始化最远可到达位置 max_k,并遍历数组 nums,通过更新 max_k 来记录每次能跳到的最远位置,如果在任何时刻 max_k 大于或等于数组的最后一个索引,则返回 True,表示可以到达数组的末尾;如果当前索引 i 超出了 max_k,则返回 False,表示无法继续前进。时间复杂度为 O(n),空间复杂度为 O(1)。
50 1
|
3月前
|
算法
LeetCode第45题跳跃游戏 II
LeetCode第45题"跳跃游戏 II"的解题方法,通过一次循环和选择每个位置的最大可跳距离,有效减少了跳跃次数,简化了问题。
|
5月前
|
算法 索引
力扣每日一题 6/28 动态规划/数组
力扣每日一题 6/28 动态规划/数组
52 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实现代码。
118 2