Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 22cc6fb

Browse files
authored
feat: add rust solution to lc problem: No.0403 (doocs#1525)
1 parent c637967 commit 22cc6fb

File tree

3 files changed

+168
-0
lines changed

3 files changed

+168
-0
lines changed

‎solution/0400-0499/0403.Frog Jump/README.md‎

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,77 @@ public:
230230
};
231231
```
232232

233+
### **Rust**
234+
235+
```rust
236+
use std::collections::HashMap;
237+
238+
impl Solution {
239+
#[allow(dead_code)]
240+
pub fn can_cross(stones: Vec<i32>) -> bool {
241+
let n = stones.len();
242+
let mut record = vec![vec![-1; n]; n];
243+
let mut pos = HashMap::new();
244+
for (i, &s) in stones.iter().enumerate() {
245+
pos.insert(s, i);
246+
}
247+
248+
Self::dfs(&mut record, 0, 0, n, &pos, &stones)
249+
}
250+
251+
#[allow(dead_code)]
252+
fn dfs(record: &mut Vec<Vec<i32>>, i: usize, k: usize, n: usize, pos: &HashMap<i32, usize>, stones: &Vec<i32>) -> bool {
253+
if i == n - 1 {
254+
return true;
255+
}
256+
257+
if record[i][k] != -1 {
258+
return record[i][k] == 1;
259+
}
260+
261+
let k = k as i32;
262+
for j in k - 1..=k + 1 {
263+
if j > 0 && pos.contains_key(&(stones[i] + j)) && Self::dfs(record, pos[&(stones[i] + j)], j as usize, n, pos, stones) {
264+
record[i][k as usize] = 1;
265+
return true;
266+
}
267+
}
268+
269+
record[i][k as usize] = 0;
270+
false
271+
}
272+
}
273+
```
274+
275+
```rust
276+
impl Solution {
277+
#[allow(dead_code)]
278+
pub fn can_cross(stones: Vec<i32>) -> bool {
279+
let n = stones.len();
280+
let mut dp = vec![vec![false; n]; n];
281+
282+
// Initialize the dp vector
283+
dp[0][0] = true;
284+
285+
// Begin the actual dp process
286+
for i in 1..n {
287+
for j in (0..=i - 1).rev() {
288+
let k = (stones[i] - stones[j]) as usize;
289+
if k - 1 > j {
290+
break;
291+
}
292+
dp[i][k] = dp[j][k - 1] || dp[j][k] || dp[j][k + 1];
293+
if i == n - 1 && dp[i][k] {
294+
return true;
295+
}
296+
}
297+
}
298+
299+
false
300+
}
301+
}
302+
```
303+
233304
### **Go**
234305

235306
```go

‎solution/0400-0499/0403.Frog Jump/README_EN.md‎

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,77 @@ public:
222222
};
223223
```
224224

225+
### **Rust**
226+
227+
```rust
228+
use std::collections::HashMap;
229+
230+
impl Solution {
231+
#[allow(dead_code)]
232+
pub fn can_cross(stones: Vec<i32>) -> bool {
233+
let n = stones.len();
234+
let mut record = vec![vec![-1; n]; n];
235+
let mut pos = HashMap::new();
236+
for (i, &s) in stones.iter().enumerate() {
237+
pos.insert(s, i);
238+
}
239+
240+
Self::dfs(&mut record, 0, 0, n, &pos, &stones)
241+
}
242+
243+
#[allow(dead_code)]
244+
fn dfs(record: &mut Vec<Vec<i32>>, i: usize, k: usize, n: usize, pos: &HashMap<i32, usize>, stones: &Vec<i32>) -> bool {
245+
if i == n - 1 {
246+
return true;
247+
}
248+
249+
if record[i][k] != -1 {
250+
return record[i][k] == 1;
251+
}
252+
253+
let k = k as i32;
254+
for j in k - 1..=k + 1 {
255+
if j > 0 && pos.contains_key(&(stones[i] + j)) && Self::dfs(record, pos[&(stones[i] + j)], j as usize, n, pos, stones) {
256+
record[i][k as usize] = 1;
257+
return true;
258+
}
259+
}
260+
261+
record[i][k as usize] = 0;
262+
false
263+
}
264+
}
265+
```
266+
267+
```rust
268+
impl Solution {
269+
#[allow(dead_code)]
270+
pub fn can_cross(stones: Vec<i32>) -> bool {
271+
let n = stones.len();
272+
let mut dp = vec![vec![false; n]; n];
273+
274+
// Initialize the dp vector
275+
dp[0][0] = true;
276+
277+
// Begin the actual dp process
278+
for i in 1..n {
279+
for j in (0..=i - 1).rev() {
280+
let k = (stones[i] - stones[j]) as usize;
281+
if k - 1 > j {
282+
break;
283+
}
284+
dp[i][k] = dp[j][k - 1] || dp[j][k] || dp[j][k + 1];
285+
if i == n - 1 && dp[i][k] {
286+
return true;
287+
}
288+
}
289+
}
290+
291+
false
292+
}
293+
}
294+
```
295+
225296
### **Go**
226297

227298
```go
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
impl Solution {
2+
#[allow(dead_code)]
3+
pub fn can_cross(stones: Vec<i32>) -> bool {
4+
let n = stones.len();
5+
let mut dp = vec![vec![false; n]; n];
6+
7+
// Initialize the dp vector
8+
dp[0][0] = true;
9+
10+
// Begin the actual dp process
11+
for i in 1..n {
12+
for j in (0..=i - 1).rev() {
13+
let k = (stones[i] - stones[j]) as usize;
14+
if k - 1 > j {
15+
break;
16+
}
17+
dp[i][k] = dp[j][k - 1] || dp[j][k] || dp[j][k + 1];
18+
if i == n - 1 && dp[i][k] {
19+
return true;
20+
}
21+
}
22+
}
23+
24+
false
25+
}
26+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /