Category | Difficulty | Likes | Dislikes |
---|
algorithms | Medium (43.11%) | 1270 | - |
Tags
array
| greedy
Companies
Unknown
给你一个非负整数数组 nums
,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
假设你总是可以到达数组的最后一个位置。
示例 1:
1
2
3
4
| 输入: nums = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
|
示例 2:
1
2
| 输入: nums = [2,3,0,1,4]
输出: 2
|
提示:
1 <= nums.length <= 104
0 <= nums[i] <= 1000
Discussion | Solution
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| struct Solution;
// @lc code=start
impl Solution {
/// ## 解题思路
/// - 贪心法
/// 1. 依次遍历各个位置;
/// 2. 记录每个位置时可到到达的最远位置next_max_pos;
/// 3. 如果当前位置是上一次能跳到的最远位置,则跳到当前位置, 同时总跳的步数+1;
pub fn jump(nums: Vec<i32>) -> i32 {
let mut steps = 0; //已跳的步数
let mut next_max_pos = 0; //下一步能跳到的最远位置
let mut last_max_pos = 0; //上一次跳到的最远位置
for pos in 0..nums.len() - 1 { //从起始位置开始一个一个条
// 下一步可以跳到的最远的位置
next_max_pos = next_max_pos.max(pos + nums[pos] as usize);
// 如果可以从上一步跳最远距离到达当前位置
if pos == last_max_pos {
steps += 1; //跳一步
//到达当前步能跳到的最远位置,则必须跳下一步
last_max_pos = next_max_pos; //更新当前步最远能跳的位置
}
}
steps as i32
}
}
// @lc code=end
|