55.jump-game.md 3.5 KB
Newer Older
Y
yulecc 已提交
1
## 题目地址(55. 跳跃游戏)
L
lucifer 已提交
2

Y
yulecc 已提交
3
https://leetcode-cn.com/problems/jump-game/
L
luzhipeng 已提交
4 5

## 题目描述
L
lucifer 已提交
6

L
luzhipeng 已提交
7
```
Y
yulecc 已提交
8
给定一个非负整数数组,你最初位于数组的第一个位置。
L
luzhipeng 已提交
9

Y
yulecc 已提交
10
数组中的每个元素代表你在该位置可以跳跃的最大长度。
L
luzhipeng 已提交
11

Y
yulecc 已提交
12
判断你是否能够到达最后一个位置。
L
luzhipeng 已提交
13

Y
yulecc 已提交
14
示例 1:
L
luzhipeng 已提交
15

Y
yulecc 已提交
16 17 18 19
输入: [2,3,1,1,4]
输出: true
解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。
示例 2:
L
luzhipeng 已提交
20

Y
yulecc 已提交
21 22 23
输入: [3,2,1,0,4]
输出: false
解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。
L
luzhipeng 已提交
24 25 26

```

L
lucifer 已提交
27 28
## 前置知识

L
lucifer 已提交
29
- [贪心](../thinkings/greedy.md)
L
lucifer 已提交
30

31 32 33 34 35 36 37
## 公司

- 阿里
- 腾讯
- 百度
- 字节

L
luzhipeng 已提交
38 39
## 思路

L
lucifer 已提交
40
这道题目是一道典型的`贪心`类型题目。思路就是用一个变量记录当前能够到达的最大的索引,并逐个遍历数组中的元素去更新这个索引,遍历完成判断这个索引是否大于`数组长度 - 1`即可。
L
lucifer 已提交
41

L
lucifer 已提交
42 43
我在[贪心](../thinkings/greedy.md)的专题中,讲到了这道题的升级版,大家可以去看一下。

L
luzhipeng 已提交
44 45
## 关键点解析

L
lucifer 已提交
46
- 记录和更新当前位置能够到达的最大的索引
L
luzhipeng 已提交
47 48 49

## 代码

z2014z's avatar
z2014z 已提交
50
- 语言支持: Javascript,C++,Java,Python3
L
lucifer 已提交
51

z2014z's avatar
z2014z 已提交
52
Javascript Code:
L
lucifer 已提交
53

L
luzhipeng 已提交
54 55 56 57 58
```js
/**
 * @param {number[]} nums
 * @return {boolean}
 */
L
lucifer 已提交
59
var canJump = function (nums) {
L
luzhipeng 已提交
60 61
  let max = 0; // 能够走到的数组下标

L
lucifer 已提交
62 63 64
  for (let i = 0; i < nums.length; i++) {
    if (max < i) return false; // 当前这一步都走不到,后面更走不到了
    max = Math.max(nums[i] + i, max);
L
luzhipeng 已提交
65 66
  }

L
lucifer 已提交
67
  return max >= nums.length - 1;
L
luzhipeng 已提交
68 69
};
```
L
lucifer 已提交
70

z2014z's avatar
z2014z 已提交
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
C++ Code:

```c++
class Solution {
public:
    bool canJump(vector<int>& nums) {
        int n=nums.size();
        int k=0;
        for(int i=0;i<n;i++)
        {
            if(i>k){
                return false;
            }
            // 能跳到最后一个位置
            if(k>=n-1){
                return true;
            }
            // 从当前位置能跳的最远的位置
            k = max(k, i+nums[i]);
        }
        return k >= n-1;
    }
};
```

Java Code:

```java
class Solution {
    public boolean canJump(int[] nums) {
        int n=nums.length;
        int k=0;
        for(int i=0;i<n;i++)
        {
            if(i>k){
                return false;
            }
            // 能跳到最后一个位置
            if(k>=n-1){
                return true;
            }
            // 从当前位置能跳的最远的位置
            k = Math.max(k, i+nums[i]);
        }
        return k >= n-1;
    }
}
```

K
kant 已提交
120
Python3 Code:
L
lucifer 已提交
121

K
kant 已提交
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
```Python
class Solution:
    def canJump(self, nums: List[int]) -> bool:
        """思路同上"""
        _max = 0
        _len = len(nums)
        for i in range(_len-1):
            if _max < i:
                return False
            _max = max(_max, nums[i] + i)
            # 下面这个判断可有可无,但提交的时候数据会好看点
            if _max >= _len - 1:
                return True
        return _max >= _len - 1
```
L
lucifer 已提交
137

L
lucifer 已提交
138 139
**_复杂度分析_**

L
lucifer 已提交
140 141
- 时间复杂度:$O(N)$
- 空间复杂度:$O(1)$
L
lucifer 已提交
142

L
lucifer 已提交
143 144 145
大家对此有何看法,欢迎给我留言,我有时间都会一一查看回答。更多算法套路可以访问我的 LeetCode 题解仓库:https://github.com/azl397985856/leetcode 。 目前已经 37K star 啦。
大家也可以关注我的公众号《力扣加加》带你啃下算法这块硬骨头。
![](https://tva1.sinaimg.cn/large/007S8ZIlly1gfcuzagjalj30p00dwabs.jpg)