贪心算法|45.跳跃游戏II

力扣题目链接

class Solution {
public:
    int jump(vector<int>& nums) {
        if (nums.size() == 1) return 0;
        int curDistance = 0;    // 当前覆盖最远距离下标
        int ans = 0;            // 记录走的最大步数
        int nextDistance = 0;   // 下一步覆盖最远距离下标
        for (int i = 0; i < nums.size(); i++) {
            nextDistance = max(nums[i] + i, nextDistance);  // 更新下一步覆盖最远距离下标
            if (i == curDistance) {                         // 遇到当前覆盖最远距离下标
                ans++;                                  // 需要走下一步
                curDistance = nextDistance;             // 更新当前覆盖最远距离下标(相当于加油了)
                if (nextDistance >= nums.size() - 1) break;  // 当前覆盖最远距到达集合终点,不用做ans++操作了,直接结束
            }
        }
        return ans;
    }
};

这题难了一点,它求的是步数

思路

本题相对于55.跳跃游戏 (opens new window)还是难了不少。

但思路是相似的,还是要看最大覆盖范围。

本题要计算最少步数,那么就要想清楚什么时候步数才一定要加一呢?

贪心的思路,局部最优:当前可移动距离尽可能多走,如果还没到终点,步数再加一。整体最优:一步尽可能多走,从而达到最少步数。

思路虽然是这样,但在写代码的时候还不能真的能跳多远就跳多远,那样就不知道下一步最远能跳到哪里了。

所以真正解题的时候,要从覆盖范围出发,不管怎么跳,覆盖范围内一定是可以跳到的,以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最少步数!

这里需要统计两个覆盖范围,当前这一步的最大覆盖和下一步最大覆盖

如果移动下标达到了当前这一步的最大覆盖最远距离了,还没有到终点的话,那么就必须再走一步来增加覆盖范围,直到覆盖范围覆盖了终点。

如图:

45.跳跃游戏II

图中覆盖范围的意义在于,只要红色的区域,最多两步一定可以到!(不用管具体怎么跳,反正一定可以跳到)

#方法一

从图中可以看出来,就是移动下标达到了当前覆盖的最远距离下标时,步数就要加一,来增加覆盖距离。最后的步数就是最少步数。

这里还是有个特殊情况需要考虑,当移动下标达到了当前覆盖的最远距离下标时

  • 如果当前覆盖最远距离下标不是是集合终点,步数就加一,还需要继续走。
  • 如果当前覆盖最远距离下标就是是集合终点,步数不用加一,因为不能再往后走了。

自己的思路

本题的关键是求步数ans

 if (i == curDistance) {                         // 遇到当前覆盖最远距离下标
                ans++;                                  // 需要走下一步
                curDistance = nextDistance;             // 更新当前覆盖最远距离下标(相当于加油了)
                if (nextDistance >= nums.size() - 1) break;  // 当前覆盖最远距到达集合终点,不用做ans++操作了,直接结束
            }

这一步不太好理解

 不过代码还是好记的。

这题需要明天再复习一下,自己独立敲出!

最近更新

  1. TCP协议是安全的吗?

    2024-04-07 06:52:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-07 06:52:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-07 06:52:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-07 06:52:01       18 阅读

热门阅读

  1. MQTT面试题

    2024-04-07 06:52:01       12 阅读
  2. leetcode热题HOT 23. 合并 K 个升序链表

    2024-04-07 06:52:01       12 阅读
  3. [高考] 数理化

    2024-04-07 06:52:01       12 阅读
  4. centos 安装 stable-diffusion 详细流程

    2024-04-07 06:52:01       12 阅读
  5. QT智能指针

    2024-04-07 06:52:01       18 阅读
  6. 【工具或平台】Gem5编译

    2024-04-07 06:52:01       14 阅读
  7. vue指令v-model

    2024-04-07 06:52:01       14 阅读
  8. Transformer架构的自注意力机制

    2024-04-07 06:52:01       13 阅读
  9. Django -- 报错

    2024-04-07 06:52:01       11 阅读