This commit is contained in:
programmercarl
2023-04-21 22:50:16 +08:00
80 changed files with 2049 additions and 502 deletions

View File

@@ -4,7 +4,6 @@
</a>
<p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
# 55. 跳跃游戏
[力扣题目链接](https://leetcode.cn/problems/jump-game/)
@@ -15,20 +14,25 @@
判断你是否能够到达最后一个位置。
示例 1:
* 输入: [2,3,1,1,4]
* 输出: true
* 解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。
示例  1:
示例 2:
*: [3,2,1,0,4]
* 输出: false
* 解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 所以你永远不可能到达最后一个位置。
- 输入: [2,3,1,1,4]
-: true
- 解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。
示例  2:
- 输入: [3,2,1,0,4]
- 输出: false
- 解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 所以你永远不可能到达最后一个位置。
# 视频讲解
**《代码随想录》算法视频公开课:[贪心算法,怎么跳跃不重要,关键在覆盖范围 | LeetCode55.跳跃游戏](https://www.bilibili.com/video/BV1VG4y1X7kB),相信结合视频在看本篇题解,更有助于大家对本题的理解**。
## 思路
刚看到本题一开始可能想当前位置元素如果是3我究竟是跳一步呢还是两步呢还是三步呢究竟跳几步才是最优呢
刚看到本题一开始可能想:当前位置元素如果是 3我究竟是跳一步呢还是两步呢还是三步呢究竟跳几步才是最优呢
其实跳几步无所谓,关键在于可跳的覆盖范围!
@@ -49,11 +53,11 @@
![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230203105634.png)
i每次移动只能在cover的范围内移动每移动一个元素cover得到该元素数值新的覆盖范围的补充i继续移动下去。
i 每次移动只能在 cover 的范围内移动每移动一个元素cover 得到该元素数值(新的覆盖范围)的补充,让 i 继续移动下去。
而cover每次只取 max(该元素数值补充后的范围, cover本身范围)。
cover 每次只取 max(该元素数值补充后的范围, cover 本身范围)。
如果cover大于等于了终点下标直接return true就可以了。
如果 cover 大于等于了终点下标,直接 return true 就可以了。
C++代码如下:
@@ -71,6 +75,11 @@ public:
}
};
```
* 时间复杂度: O(n)
* 空间复杂度: O(1)
## 总结
这道题目关键点在于:不用拘泥于每次究竟跳几步,而是看覆盖范围,覆盖范围内一定是可以跳过来的,不用管是怎么跳的。
@@ -83,8 +92,8 @@ public:
## 其他语言版本
### Java
### Java
```Java
class Solution {
public boolean canJump(int[] nums) {
@@ -106,6 +115,7 @@ class Solution {
```
### Python
```python
class Solution:
def canJump(self, nums: List[int]) -> bool:
@@ -156,9 +166,7 @@ func max(a, b int ) int {
}
```
### Javascript
### Javascript
```Javascript
var canJump = function(nums) {
@@ -178,16 +186,16 @@ var canJump = function(nums) {
```Rust
impl Solution {
fn max(a: usize, b: usize) -> usize {
if a > b { a } else { b }
}
pub fn can_jump(nums: Vec<i32>) -> bool {
let mut cover = 0;
if (nums.len() == 1) { return true; }
let mut i = 0;
if nums.len() == 1 {
return true;
}
let (mut i, mut cover) = (0, 0);
while i <= cover {
cover = Self::max(i + nums[i] as usize, cover);
if cover >= nums.len() - 1 { return true; }
cover = (i + nums[i] as usize).max(cover);
if cover >= nums.len() - 1 {
return true;
}
i += 1;
}
false
@@ -196,6 +204,7 @@ impl Solution {
```
### C
```c
#define max(a, b) (((a) > (b)) ? (a) : (b))
@@ -217,23 +226,23 @@ bool canJump(int* nums, int numsSize){
}
```
### TypeScript
```typescript
function canJump(nums: number[]): boolean {
let farthestIndex: number = 0;
let cur: number = 0;
while (cur <= farthestIndex) {
farthestIndex = Math.max(farthestIndex, cur + nums[cur]);
if (farthestIndex >= nums.length - 1) return true;
cur++;
}
return false;
};
let farthestIndex: number = 0;
let cur: number = 0;
while (cur <= farthestIndex) {
farthestIndex = Math.max(farthestIndex, cur + nums[cur]);
if (farthestIndex >= nums.length - 1) return true;
cur++;
}
return false;
}
```
### Scala
```scala
object Solution {
def canJump(nums: Array[Int]): Boolean = {
@@ -250,7 +259,6 @@ object Solution {
}
```
<p align="center">
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>