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

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

由于这道题保证一定能跳到终点,所以我们只需要考虑如何花最少的次数跳到终点,这里我们定义resultcurrentnext三个变量,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;
    }
};
相关推荐
flashlight_hi1 小时前
LeetCode 分类刷题:2563. 统计公平数对的数目
python·算法·leetcode
楼田莉子1 小时前
C++算法专题学习:栈相关的算法
开发语言·c++·算法·leetcode
dragoooon341 小时前
[数据结构——lesson3.单链表]
数据结构·c++·leetcode·学习方法
轮到我狗叫了2 小时前
力扣.1054距离相等的条形码力扣767.重构字符串力扣47.全排列II力扣980.不同路径III力扣509.斐波那契数列(记忆化搜索)
java·算法·leetcode
dragoooon343 小时前
[优选算法专题二滑动窗口——串联所有单词的子串]
数据结构·c++·学习·算法·leetcode·学习方法
刃神太酷啦3 小时前
C++ 异常处理机制:从基础到实践的全面解析----《Hello C++ Wrold!》(20)--(C/C++)
java·c语言·开发语言·c++·qt·算法·leetcode
私人珍藏库5 小时前
[吾爱原创] 【游戏】王富贵的果菜园
游戏
薰衣草23336 小时前
滑动窗口(2)——不定长
python·算法·leetcode
纪元A梦11 小时前
贪心算法应用:化工反应器调度问题详解
算法·贪心算法
纪元A梦15 小时前
贪心算法应用:保险理赔调度问题详解
算法·贪心算法