力扣HOT100之贪心算法:45. 跳跃游戏 II

这道题刷代码随想录的时候也刷过,本来以为有了上一题55.跳跃游戏的基础,这道题会好做一点,但是依旧想不出来思路,回去看了下自己当时写的博客,没想到今天的感受和当时的感受都一模一样。。。What can I say?看了下代码随想录的视频和灵神的题解,终于把这个问题彻底弄清楚了。

由于这道题保证一定能跳到终点,所以我们只需要考虑如何花最少的次数跳到终点,这里我们定义result,current和next三个变量,result用于记录最小跳跃次数,current代表本次跳跃后所能达到的覆盖范围的最远边界,next代表下一次跳跃所能达到的最远覆盖范围,然后用一个for循环来遍历nums的元素,当我们遍历到current处,则说明我们已经达到了当前覆盖范围的边界,我们需要先判断是否已经到达数组的边界,如果还没到达,则当前是已经到达覆盖范围边界但是尚未达到数组的边界 。我们必须跳跃一次,并将current移动到下一次跳跃后的覆盖范围的边界,即current = next;,result++;;当进入下一轮for循环时,则i进入下次跳跃的覆盖范围,我们再不断地更新下下次跳跃的最远覆盖范围,即next = max(next, i + nums[i]);。如果i已经到达了数组边界,则无需进行下一次跳跃,直接退出循环即可。

cpp 复制代码
class Solution {
public:
    int jump(vector<int>& nums) {
        int current = 0;  //记录当前所在的位置
        int result = 0;   //记录最小次数
        int next = 0;
        for(int i = 0; i < nums.size(); i++){
            next = max(next, i + nums[i]);   //更新最大覆盖范围
            if(i == current){  
                //已经到达覆盖范围边界,需要进行一次跳跃,直接跳到下一个最大覆盖范围的边界
                if(i != nums.size() - 1){  //已经到达覆盖范围边界但是尚未达到数组的边界
                    result++;
                    current = next;
                }
            }
        }
        return result;
    }
};
相关推荐
Pniubi6 小时前
力扣283移动零(双指针法)
算法·leetcode·职场和发展
hkNaruto8 小时前
【AI】基于大模型的AI游戏地图生成、控制方案:AI Native Game Harness 迁移操作手册
前端·人工智能·游戏
揽星河..14 小时前
【C语言】猜数字游戏
c语言·算法·游戏
释厄62315 小时前
AI 军备竞赛悖论——为 AI 卖游戏但 AI 需要游戏母场景
人工智能·游戏·kotlin
旖旎夜光16 小时前
LeetCode 315: 算右侧小于当前元素的个数(归并排序) —— 题解
c++·学习·算法·leetcode·排序算法
文丑颜不良啊16 小时前
LeetCode1401~1420题目解析
java·leetcode
Nuanyt16 小时前
LeetCode Hot 100 链表专题2 3 题 (Java)
java·笔记·算法·leetcode·链表
文丑颜不良啊16 小时前
LeetCode1341~1360题目解析
java·leetcode
海绵宝宝转agent17 小时前
LeetCodehot100题解
java·笔记·学习·算法·leetcode·深度优先
Pniubi19 小时前
力扣543二叉树的直径(深度优先搜索法(递归))
算法·leetcode·职场和发展