| |
|
开发:
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.跳跃游戏 II -> 正文阅读 |
|
[数据结构与算法]LeetCode-45.跳跃游戏 II |
45. 跳跃游戏 II
示例 1:
示例 2:
分析阶段
输入一个数组 n u m s nums nums,可以从下标 i i i 处,最远跳到下标 i + n u m s [ i ] i+nums[i] i+nums[i] 处,求解最少跳跃几次,能够达到最后一个下标。 按照“动态规划”的解题思路,我们需要确定:状态、base case、数组、状态转移方程。 1、问题类型第二类:对某种数结构和算法的使用 使用的算法:动态规划 数据结构:构造状态数组 2、解题思路解法1要求“最少跳跃几次”能够到达最后一个下标,我们可以直接构造一个数组,来保存在每个下标处需要的最少次数。求解过程如下: 1、要求解的“状态”是:输入长度为 n n n 的数组,最少跳跃几次到最后一个下标; 2、简化状态,得到“base case”:在下标 n ? 1 n-1 n?1 处,需要跳跃的次数为0; 3、构造“数组”:构造一个长度为 n n n 的数组 d p dp dp, d p [ i ] = = j dp[i] == j dp[i]==j 表示在下标 i i i 处需要最少跳跃 j j j 次才能到最后; 4、构造状态转移方程: (1)在下标 n ? 1 n-1 n?1 处,跳跃次数为 0, d p [ n ? 1 ] = 0 dp[n-1] = 0 dp[n?1]=0; (2)在下标 i i i 处,假设 n u m s [ i ] = = j nums[i]==j nums[i]==j,那么此时可以跳跃的范围下标是: [ i + 1 , i + 2 , . . . , i + j ] , d p [ i ] = m i n ( d p [ i + 1 , i + 2 , . . . , i + j ] ) + 1 [i+1,i+2,...,i+j],dp[i] = min(dp[i+1,i+2,...,i+j]) + 1 [i+1,i+2,...,i+j],dp[i]=min(dp[i+1,i+2,...,i+j])+1; 状态转移方程如下: 在每个下标处,都要在一个范围内找出最小值,性能很差,在 LeetCode 的提交结果如下: 官方题解官方题解给出的解法很难理解,用一个简单示例来描述:一辆汽车从下标0处开始出发,每个下标上的值表示它在该位置加油后能够走的距离,最少加几次油能到达终点。 官方题解中的两个变量:边界 end、最远下标 maxPosition,可以理解为:
这样,汽车从起点开始出发,路过每一个加油点,不断计算着自己的 end 和 maxPosition,整个过程如下:
代码实现在“编码阶段-官方题解”部分。 编码阶段实现1
官方题解
总结阶段通过“汽车加油”来类比“跳跃几次”,每次到达边界都加油一次。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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 17:25:26- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |