| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> LeetCode-55. 跳跃游戏 -> 正文阅读 |
|
[数据结构与算法]LeetCode-55. 跳跃游戏 |
55. 跳跃游戏
示例 1:
示例 2:
分析阶段
输入一个数组 n u m s nums nums,可以从下标 i i i 处,最远跳到下标 i + n u m s [ i ] i+nums[i] i+nums[i] 处,判断是否能从下标0开始,跳跃到数组的最后一个下标。 按照“动态规划”的解题思路,我们需要确定:状态、base case、数组、状态转移方程。 1、问题类型第二类:对某种数结构和算法的使用 使用的算法:动态规划 数据结构:构造状态数组 2、解题思路解法1n u m s [ i ] nums[i] nums[i] 记录的是在下标 i i i 处能够跳跃的最远距离,如果 n u m s [ i ] = j nums[i] = j nums[i]=j,那么在下标 i i i 处就能跳跃到范围 i , i + 1 , i + 2 , . . . , i + j i,i+1,i+2,...,i+j i,i+1,i+2,...,i+j 中的任意一个下标处。因此,只要下标0处能够跳跃的最远距离大于等于 n ? 1 n-1 n?1,就能从起点跳跃到最后一个下标。 我们通过计算每个下标处能够跳跃的最远距离,来求解最终结果。求解过程如下: 1、要求解的“状态”是:输入长度为 n n n 的数组,要判断是否能够跳跃到最后一个下标; 2、简化状态,得到“base case”:在最后一个下标处,能够跳跃的最远下标是 n ? 1 n-1 n?1; 3、构造“数组”:构造一个长度为 n n n 的数组 d p dp dp, d p [ i ] dp[i] dp[i] 的值表示在下标 i i i 处,最远能够跳跃到的最远下标; 4、构造状态转移方程: 在下标 i i i 处,它的值为 n u m s [ i ] = j nums[i] = j nums[i]=j,意味着可以跳跃到 i , i + 1 , i + 2 , . . . , i + j i,i+1,i+2,...,i+j i,i+1,i+2,...,i+j 中的任意一个下标处,并继续向后跳跃,直到某个下标值为0。因此 d p [ i ] dp[i] dp[i] 的值时 d p [ i + 1 ] , . . . , d p [ i + j ] dp[i+1],...,dp[i+j] dp[i+1],...,dp[i+j] 中的最大值。 状态转移方程如下: 从代码中可以看出,每个下标处都要在一个范围内找出最大值,性能很差,在 LeetCode 的提交结果如下: 解法2问题要求解的是”能否跳到最后一个下标“,所以我们可以直接判断在一个下标处是否能够跳跃到最后一个下标。求解过程如下: 1、要求解的“状态”是:输入长度为 n n n 的数组,要判断是否能够跳跃到最后一个下标; 2、简化状态,得到“base case”:输入的数组长度为1,一定可以到达; 3、构造“数组”:构造一个长度为 n n n 的数组 d p dp dp, d p [ i ] = = t r u e dp[i] == true dp[i]==true 表示能够跳到下标 i i i; 4、构造状态转移方程: (1)因为从数组的下标0开始起跳,所以如果数组长度 n = = 1 n==1 n==1,一定可以跳到; (2)如果 n > 1 n>1 n>1,且 n u m s [ 0 ] = = 0 nums[0] == 0 nums[0]==0,不能从起点继续向后跳跃,此时 d p [ i ] = f a l s e dp[i] = false dp[i]=false; (3)如果可以跳跃到下标 i i i,假设 n u m s [ i ] = = j nums[i]==j nums[i]==j,那么此时可以跳跃的范围下标是: [ i + 1 , i + 2 , . . . , i + j ] [i+1,i+2,...,i+j] [i+1,i+2,...,i+j],更新 d p [ i + 1 , i + 2 , . . . , i + j ] = t r u e dp[i+1,i+2,...,i+j] = true dp[i+1,i+2,...,i+j]=true。 状态转移方程如下: 在代码中,从0开始向后遍历,为了避免重复设置 $dp $中的值,使用变量 m a x I n d e x maxIndex maxIndex 表示已知可以跳跃到的最远下标,后面的遍历可以从 m a x I n d e x maxIndex maxIndex 开始设置值。在 LeetCode 上的结果如下: 解法3第三种解法来自官方题解,它最关键的思想就是:如果可以跳跃到下标 i i i,并且 i + n u m s [ i ] ≥ n ? 1 i + nums[i] \ge n-1 i+nums[i]≥n?1,那么就一定能跳跃到最后一个下标。 所以,我们要做的就是:从0开始向后遍历,不断更新能够跳跃到的最远下标,在这个下标范围内找到能够跳跃到最后一个下标的位置。 代码实现在“编码阶段-实现3”部分。 编码阶段实现1
实现2
实现3
总结阶段“跳跃游戏“关键是找到它的核心思路: 1、能够跳到当前位置 2、当前位置能够跳到的最远下标 只要维护“当前能够跳跃到的最远下标”,就能只需要一次遍历得到结果。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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 16:34:50- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |