算法日常・每日刷题--<贪心>17

45. 跳跃游戏 II - 力扣(LeetCode)45. 跳跃游戏 II - 给定一个长度为 n 的 0 索引整数数组 nums。初始位置在下标 0。每个元素 numsi 表示从索引 i 向后跳转的最大长度。换句话说,如果你在索引 i 处,你可以跳转到任意 (i + j) 处: * 0 <= j <= numsi 且 * i + j < n返回到达 n - 1 的最小跳跃次数。测试用例保证可以到达 n - 1。 示例 1:输入: nums = 2,3,1,1,4输出: 2解释: 跳到最后一个位置的最小跳跃数是 2。 从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。示例 2:输入: nums = 2,3,0,1,4输出: 2 提示: * 1 <= nums.length <= 104 * 0 <= numsi <= 1000 * 题目保证可以到达 n - 1https://leetcode.cn/problems/jump-game-ii/submissions/750293523/

题目描述

给定一个长度为 n 的 0 索引整数数组 nums。初始位置在下标 0。

每个元素 nums[i] 表示从索引 i 向后跳转的最大长度。 如果你在索引 i 处,可以跳转到任意 i+j

核心思路

这道题的贪心思路本质上等价于BFS 层序遍历: 把每一次跳跃看作一层。

  • 在当前一层覆盖的区间内,不断更新能跳到的最远下标
  • 当遍历走到当前层的边界时,代表这一层已经全部探索完毕,必须进行一次跳跃,更新下一层的边界
  • 一旦边界覆盖到数组末尾,直接结束,得到最小步数

贪心选择:在当前能到达的区间里,尽可能找到跳得最远的位置,从而减少总跳跃次数。

为什么贪心可以得到最小步数? 要步数最少,每一跳就要最大化覆盖范围,这是局部最优推出全局最优。

cpp 复制代码
class Solution {
public:
    int jump(vector<int>& nums) {
        int n=nums.size();
        if(n==1)
        return 0;
        int step = 0;
        int end = 0;      
        int maxReach = 0;
        for(int i=0;i<n;i++){
            maxReach=max(maxReach,i+nums[i]);
            if(i == end)
            {
                step++;
                end = maxReach;
                if(end >= n-1) break;
            }
        }
        return step;
    }
};
相关推荐
liliangcsdn28 分钟前
派息率指标的应用探索和分析
大数据·算法
垆边人似月.1 小时前
华为机试题 :两数之和
c++·算法·华为
默默开发1 小时前
物流行业可用算法方向
算法
垆边人似月.1 小时前
华为机试题 :有效的括号
c++·算法·华为
A加ITIL教练长河achotsao2 小时前
ITIL Master 战略领导者课后系列分享:AI编程正在重新划分研发与运维的边界
算法
hahaha60162 小时前
FPGA+ARM实现AWB的全流程
人工智能·嵌入式硬件·算法·计算机视觉·fpga开发
李洱2 小时前
LangChain 和 LangGraph 的区别:核心原理与使用场景
算法
夏幻灵2 小时前
每日一题:LeetCode 206:反转链表——三指针与原地反转详解
算法·leetcode·链表
岁月蹉跎的一杯酒2 小时前
CCM-可调颜色校正与噪声权衡
图像处理·算法·isp
在所不辞兄3 小时前
选择隐式方法求解刚性ODE
算法