Keshawn_lu's Blog

Leetcode 45. 跳跃游戏 II

字数统计: 486阅读时长: 1 min
2020/05/04 Share

题目简介

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

你的目标是使用最少的跳跃次数到达数组的最后一个位置。

示例:

1
2
3
4
输入: [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
  从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

思路:首先定义一个far来表示在遍历元素的过程中(遍历至每次跳跃的终点end前),所能达到的最远的距离,即为下次跳跃的end。每次到达end以后,即一次跳跃结束,更新end后进行下一次的跳跃。

如示例中[2,3,1,1,4], 第一次跳跃从nums[0] = 2开始,所能到达的最远的点为num[2] = 1(第一次的end),即这次跳跃有两个选择(num[1] = 3 和 nums[2] = 1),那么我们在遍历这两个点的时候,可以算出在num[1] = 3这个点,所能到达的距离是最远的,可以到达num[4] = 4,所以我们在第一次跳跃结束时(也就是到达了nums[2] = 1这个点),更新end为nums[4] = 4这个点,并开始第二次跳跃。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
public:
int jump(vector<int>& nums) {

int far = 0; //能跳的最远的地方
int end = 0; //每次跳跃结束的标志

int count = 0;

for(int i = 0; i < nums.size() - 1; i++){

far = max(far, nums[i] + i); //得出能跳到的最远的地方

if(i == end){ //到达每次跳跃最远的地方,进行下一次跳跃

end = far; //将之前几格里能跳跃到的最远的地方赋值,作为下次结束的地点
count++;
}
}

return count;
}
};
CATALOG
  1. 1. 题目简介