IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> LeetCode·45.跳跃游戏 ||· 贪心·动态规划 -> 正文阅读

[数据结构与算法]LeetCode·45.跳跃游戏 ||· 贪心·动态规划

链接:https://leetcode.cn/problems/jump-game-ii/solution/-by-xun-ge-v-l2cc/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。?

题目

?

示例

?

思路

解题思路
【贪心】

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

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

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

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

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

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

【动态规划】
定义dp数组

  • 含义:dp[i]表示从下标0到下标i所以的最小跳跃步数
  • 初始化:因为需要动态更新dp,所以初始化应该为最大值,才能保存最小值
  • 动态状态方程:dp[i] = MIN(dp[i],dp[j]+1);

如何判断从下标0到下标i所以的最小跳跃步数,使用双指针,一个指向当前位置i,一个从0开始遍历,判断需要多少步才能到当前位置,每次保存最小步数。

代码

【贪心】

#define MAX(a, b) ((a) > (b) ? (a) : (b))

int jump(int* nums, int numsSize){ 
    int curDistance = 0;    // 当前覆盖的最远距离下标
    int ans = 0;            // 记录走的最大步数
    int nextDistance = 0;   // 下一步覆盖的最远距离下标
    for (int i = 0; i < numsSize - 1; i++) { // 注意这里是小于nums.size() - 1,这是关键所在
        nextDistance = MAX(nums[i] + i, nextDistance); // 更新下一步覆盖的最远距离下标
        if (i == curDistance) {                 // 遇到当前覆盖的最远距离下标
            curDistance = nextDistance;         // 更新当前覆盖的最远距离下标
            ans++;
        }
    }
    return ans;
}

作者:xun-ge-v
链接:https://leetcode.cn/problems/jump-game-ii/solution/-by-xun-ge-v-l2cc/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

【动态规划】

#define MIN(a, b) ((a) < (b) ? (a) : (b))

int jump(int* nums, int numsSize)
{
    //定义dp数组
    int dp[numsSize];
    dp[0] = 0;
    //双重遍历
   
    for(int i =1; i< numsSize; i++)
    {
        dp[i] = INT_MAX;//初始化最大值
        for(int j = 0; j < i; j++)
        {
            if(j + nums[j] >= i)
            {
                dp[i] = MIN(dp[i],dp[j]+1);//更新dp数组,保存最小值
            }
        }
    }
    return dp[numsSize-1];
}

作者:xun-ge-v
链接:https://leetcode.cn/problems/jump-game-ii/solution/-by-xun-ge-v-l2cc/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-09-15 02:14:52  更:2022-09-15 02:15:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 21:36:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码