Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 3dfdeb8

Browse files
author
Zhang Xiaodong
committed
solve 45
1 parent 9fec2a9 commit 3dfdeb8

File tree

2 files changed

+90
-0
lines changed

2 files changed

+90
-0
lines changed

src/solution/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,4 @@ mod s0041_first_missing_positive;
4040
mod s0042_trapping_rain_water;
4141
mod s0043_multiply_strings;
4242
mod s0044_wildcard_matching;
43+
mod s0045_jump_game_ii;

src/solution/s0045_jump_game_ii.rs

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
/**
2+
* [45] 跳跃游戏 II
3+
*
4+
* 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。
5+
* 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:
6+
*
7+
* 0 <= j <= nums[i]
8+
* i + j < n
9+
*
10+
* 返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]。
11+
*
12+
* 示例 1:
13+
*
14+
* 输入: nums = [2,3,1,1,4]
15+
* 输出: 2
16+
* 解释: 跳到最后一个位置的最小跳跃数是 2。
17+
* 从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
18+
*
19+
* 示例 2:
20+
*
21+
* 输入: nums = [2,3,0,1,4]
22+
* 输出: 2
23+
*
24+
*
25+
* 提示:
26+
*
27+
* 1 <= nums.length <= 10^4
28+
* 0 <= nums[i] <= 1000
29+
* 题目保证可以到达 nums[n-1]
30+
*
31+
*/
32+
pub struct Solution {}
33+
34+
// problem: https://leetcode.cn/problems/jump-game-ii/
35+
// discuss: https://leetcode.cn/problems/jump-game-ii/discuss/?currentPage=1&orderBy=most_votes&query=
36+
37+
// submission codes start here
38+
39+
impl Solution {
40+
pub fn jump(nums: Vec<i32>) -> i32 {
41+
// 动态规划可以,但是有点慢
42+
// let mut jp = vec![10000; nums.len()];
43+
// jp[0] = 0;
44+
// for i in 0..nums.len() {
45+
// for j in 1..=(nums[i] as usize) {
46+
// if i + j >= nums.len() {
47+
// break;
48+
// }
49+
// if jp[i+j] > jp[i] + 1 {
50+
// jp[i+j] = jp[i] + 1
51+
// }
52+
// }
53+
// }
54+
// jp[nums.len()-1]
55+
56+
let mut step = 0;
57+
// 本次step元素段的范围
58+
let mut end = 0;
59+
// 本元素段内元素能到达的最远范围,也就是下次step的end
60+
let mut fartest = 0;
61+
for i in 0..nums.len() {
62+
// 本元素段已经能到达末尾,直接返回本step即可
63+
if end >= nums.len() - 1 {
64+
return step
65+
}
66+
let forward = i + (nums[i] as usize);
67+
fartest = if fartest < forward { forward } else { fartest };
68+
if i == end {
69+
end = fartest;
70+
step += 1;
71+
}
72+
}
73+
step
74+
}
75+
}
76+
77+
// submission codes end
78+
79+
#[cfg(test)]
80+
mod tests {
81+
use super::*;
82+
83+
#[test]
84+
fn test_45() {
85+
assert_eq!(Solution::jump(vec![2,3,1,4]), 2);
86+
assert_eq!(Solution::jump(vec![2,3,0,1,4]), 2);
87+
assert_eq!(Solution::jump(vec![2,0,2,0,1]), 2);
88+
}
89+
}

0 commit comments

Comments
 (0)