docs:跳跃游戏二添加视频链接

This commit is contained in:
liangzhensheng
2023-03-17 11:21:12 +08:00
parent 29646b86b9
commit 6f8d5eb7a0

View File

@ -4,10 +4,9 @@
</a> </a>
<p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p> <p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
> 相对于[贪心算法:跳跃游戏](https://mp.weixin.qq.com/s/606_N9j8ACKCODoCbV1lSA)难了不少,做好心里准备!
> 相对于[贪心算法:跳跃游戏](https://mp.weixin.qq.com/s/606_N9j8ACKCODoCbV1lSA)难了不少,做好心里准备! # 45.跳跃游戏 II
# 45.跳跃游戏II
[力扣题目链接](https://leetcode.cn/problems/jump-game-ii/) [力扣题目链接](https://leetcode.cn/problems/jump-game-ii/)
@ -18,13 +17,17 @@
你的目标是使用最少的跳跃次数到达数组的最后一个位置。 你的目标是使用最少的跳跃次数到达数组的最后一个位置。
示例: 示例:
* 输入: [2,3,1,1,4]
*: 2 -: [2,3,1,1,4]
* 解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置 1 然后跳 3 步到达数组的最后一个位置。 - 输出: 2
- 解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳  1  步,然后跳  3  步到达数组的最后一个位置。
说明: 说明:
假设你总是可以到达数组的最后一个位置。 假设你总是可以到达数组的最后一个位置。
# 视频讲解
**《代码随想录》算法视频公开课:[贪心算法,最少跳几步还得看覆盖范围 | LeetCode 45.跳跃游戏 II](https://www.bilibili.com/video/BV1Y24y1r7XZ),相信结合视频在看本篇题解,更有助于大家对本题的理解**。
## 思路 ## 思路
@ -46,7 +49,6 @@
如图: 如图:
![45.跳跃游戏II](https://code-thinking-1253855093.file.myqcloud.com/pics/20201201232309103.png) ![45.跳跃游戏II](https://code-thinking-1253855093.file.myqcloud.com/pics/20201201232309103.png)
**图中覆盖范围的意义在于,只要红色的区域,最多两步一定可以到!(不用管具体怎么跳,反正一定可以跳到)** **图中覆盖范围的意义在于,只要红色的区域,最多两步一定可以到!(不用管具体怎么跳,反正一定可以跳到)**
@ -57,8 +59,8 @@
这里还是有个特殊情况需要考虑,当移动下标达到了当前覆盖的最远距离下标时 这里还是有个特殊情况需要考虑,当移动下标达到了当前覆盖的最远距离下标时
* 如果当前覆盖最远距离下标不是是集合终点,步数就加一,还需要继续走。 - 如果当前覆盖最远距离下标不是是集合终点,步数就加一,还需要继续走。
* 如果当前覆盖最远距离下标就是是集合终点,步数不用加一,因为不能再往后走了。 - 如果当前覆盖最远距离下标就是是集合终点,步数不用加一,因为不能再往后走了。
C++代码如下:(详细注释) C++代码如下:(详细注释)
@ -92,14 +94,14 @@ public:
**针对于方法一的特殊情况,可以统一处理**,即:移动下标只要遇到当前覆盖最远距离的下标,直接步数加一,不考虑是不是终点的情况。 **针对于方法一的特殊情况,可以统一处理**,即:移动下标只要遇到当前覆盖最远距离的下标,直接步数加一,不考虑是不是终点的情况。
想要达到这样的效果只要让移动下标最大只能移动到nums.size - 2的地方就可以了。 想要达到这样的效果,只要让移动下标,最大只能移动到 nums.size - 2 的地方就可以了。
因为当移动下标指向nums.size - 2时 因为当移动下标指向 nums.size - 2 时:
* 如果移动下标等于当前覆盖最大距离下标, 需要再走一步即ans++),因为最后一步一定是可以到的终点。(题目假设总是可以到达数组的最后一个位置),如图: - 如果移动下标等于当前覆盖最大距离下标, 需要再走一步(即 ans++),因为最后一步一定是可以到的终点。(题目假设总是可以到达数组的最后一个位置),如图:
![45.跳跃游戏II2](https://code-thinking-1253855093.file.myqcloud.com/pics/20201201232445286.png) ![45.跳跃游戏II2](https://code-thinking-1253855093.file.myqcloud.com/pics/20201201232445286.png)
* 如果移动下标不等于当前覆盖最大距离下标,说明当前覆盖最远距离就可以直接达到终点了,不需要再走一步。如图: - 如果移动下标不等于当前覆盖最大距离下标,说明当前覆盖最远距离就可以直接达到终点了,不需要再走一步。如图:
![45.跳跃游戏II1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201201232338693.png) ![45.跳跃游戏II1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201201232338693.png)
@ -127,7 +129,7 @@ public:
可以看出版本二的代码相对于版本一简化了不少! 可以看出版本二的代码相对于版本一简化了不少!
**其精髓在于控制移动下标i只移动到nums.size() - 2的位置**,所以移动下标只要遇到当前覆盖最远距离的下标,直接步数加一,不用考虑别的了。 **其精髓在于控制移动下标 i 只移动到 nums.size() - 2 的位置**,所以移动下标只要遇到当前覆盖最远距离的下标,直接步数加一,不用考虑别的了。
## 总结 ## 总结
@ -137,11 +139,10 @@ public:
理解本题的关键在于:**以最小的步数增加最大的覆盖范围,直到覆盖范围覆盖了终点**,这个范围内最小步数一定可以跳到,不用管具体是怎么跳的,不纠结于一步究竟跳一个单位还是两个单位。 理解本题的关键在于:**以最小的步数增加最大的覆盖范围,直到覆盖范围覆盖了终点**,这个范围内最小步数一定可以跳到,不用管具体是怎么跳的,不纠结于一步究竟跳一个单位还是两个单位。
## 其他语言版本 ## 其他语言版本
### Java ### Java
```Java ```Java
// 版本一 // 版本一
class Solution { class Solution {
@ -230,6 +231,7 @@ class Solution:
step += 1 step += 1
return step return step
``` ```
```python ```python
# 动态规划做法 # 动态规划做法
class Solution: class Solution:
@ -244,7 +246,6 @@ class Solution:
``` ```
### Go ### Go
```go ```go
@ -331,21 +332,21 @@ var jump = function(nums) {
```typescript ```typescript
function jump(nums: number[]): number { function jump(nums: number[]): number {
const length: number = nums.length; const length: number = nums.length;
let curFarthestIndex: number = 0, let curFarthestIndex: number = 0,
nextFarthestIndex: number = 0; nextFarthestIndex: number = 0;
let curIndex: number = 0; let curIndex: number = 0;
let stepNum: number = 0; let stepNum: number = 0;
while (curIndex < length - 1) { while (curIndex < length - 1) {
nextFarthestIndex = Math.max(nextFarthestIndex, curIndex + nums[curIndex]); nextFarthestIndex = Math.max(nextFarthestIndex, curIndex + nums[curIndex]);
if (curIndex === curFarthestIndex) { if (curIndex === curFarthestIndex) {
curFarthestIndex = nextFarthestIndex; curFarthestIndex = nextFarthestIndex;
stepNum++; stepNum++;
}
curIndex++;
} }
return stepNum; curIndex++;
}; }
return stepNum;
}
``` ```
### Scala ### Scala
@ -425,7 +426,6 @@ impl Solution {
} }
``` ```
<p align="center"> <p align="center">
<a href="https://programmercarl.com/other/kstar.html" target="_blank"> <a href="https://programmercarl.com/other/kstar.html" target="_blank">
<img src="../pics/网站星球宣传海报.jpg" width="1000"/> <img src="../pics/网站星球宣传海报.jpg" width="1000"/>