Skip to content

Commit 7e78976

Browse files
authored
feat: add Rust solution for lc No.1970 (#4943)
1 parent 1a33f53 commit 7e78976

File tree

4 files changed

+440
-0
lines changed

4 files changed

+440
-0
lines changed

solution/1900-1999/1970.Last Day Where You Can Still Cross/README.md

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,67 @@ function latestDayToCross(row: number, col: number, cells: number[][]): number {
320320
}
321321
```
322322

323+
#### Rust
324+
325+
```rust
326+
use std::collections::VecDeque;
327+
328+
impl Solution {
329+
pub fn latest_day_to_cross(row: i32, col: i32, cells: Vec<Vec<i32>>) -> i32 {
330+
let mut l: i32 = 1;
331+
let mut r: i32 = cells.len() as i32;
332+
let m = row as usize;
333+
let n = col as usize;
334+
335+
let check = |k: i32, cells: &Vec<Vec<i32>>| -> bool {
336+
let mut g = vec![vec![0i32; n]; m];
337+
for i in 0..k as usize {
338+
let x = (cells[i][0] - 1) as usize;
339+
let y = (cells[i][1] - 1) as usize;
340+
g[x][y] = 1;
341+
}
342+
let dirs = [-1, 0, 1, 0, -1];
343+
let mut q: VecDeque<(usize, usize)> = VecDeque::new();
344+
for j in 0..n {
345+
if g[0][j] == 0 {
346+
q.push_back((0, j));
347+
g[0][j] = 1;
348+
}
349+
}
350+
while let Some((x, y)) = q.pop_front() {
351+
if x == m - 1 {
352+
return true;
353+
}
354+
for i in 0..4 {
355+
let nx = x as i32 + dirs[i];
356+
let ny = y as i32 + dirs[i + 1];
357+
if nx >= 0
358+
&& nx < m as i32
359+
&& ny >= 0
360+
&& ny < n as i32
361+
&& g[nx as usize][ny as usize] == 0
362+
{
363+
q.push_back((nx as usize, ny as usize));
364+
g[nx as usize][ny as usize] = 1;
365+
}
366+
}
367+
}
368+
false
369+
};
370+
371+
while l < r {
372+
let mid = (l + r + 1) >> 1;
373+
if check(mid, &cells) {
374+
l = mid;
375+
} else {
376+
r = mid - 1;
377+
}
378+
}
379+
l
380+
}
381+
}
382+
```
383+
323384
<!-- tabs:end -->
324385

325386
<!-- solution:end -->
@@ -659,6 +720,95 @@ function latestDayToCross(row: number, col: number, cells: number[][]): number {
659720
}
660721
```
661722

723+
#### Rust
724+
725+
```rust
726+
struct UnionFind {
727+
p: Vec<usize>,
728+
size: Vec<usize>,
729+
}
730+
731+
impl UnionFind {
732+
fn new(n: usize) -> Self {
733+
let mut p = vec![0; n];
734+
let mut size = vec![1; n];
735+
for i in 0..n {
736+
p[i] = i;
737+
}
738+
Self { p, size }
739+
}
740+
741+
fn find(&mut self, x: usize) -> usize {
742+
if self.p[x] != x {
743+
let px = self.p[x];
744+
self.p[x] = self.find(px);
745+
}
746+
self.p[x]
747+
}
748+
749+
fn union(&mut self, a: usize, b: usize) -> bool {
750+
let pa = self.find(a);
751+
let pb = self.find(b);
752+
if pa == pb {
753+
return false;
754+
}
755+
if self.size[pa] > self.size[pb] {
756+
self.p[pb] = pa;
757+
self.size[pa] += self.size[pb];
758+
} else {
759+
self.p[pa] = pb;
760+
self.size[pb] += self.size[pa];
761+
}
762+
true
763+
}
764+
}
765+
766+
impl Solution {
767+
pub fn latest_day_to_cross(row: i32, col: i32, cells: Vec<Vec<i32>>) -> i32 {
768+
let mn = cells.len();
769+
let mut uf = UnionFind::new(mn + 2);
770+
let s = mn;
771+
let t = mn + 1;
772+
let row = row as usize;
773+
let col = col as usize;
774+
775+
let mut g = vec![vec![1i32; col]; row];
776+
let dirs = [-1, 0, 1, 0, -1];
777+
778+
let mut i = mn as i32 - 1;
779+
loop {
780+
let x = (cells[i as usize][0] - 1) as usize;
781+
let y = (cells[i as usize][1] - 1) as usize;
782+
g[x][y] = 0;
783+
784+
for j in 0..4 {
785+
let nx = x as i32 + dirs[j];
786+
let ny = y as i32 + dirs[j + 1];
787+
if nx >= 0
788+
&& nx < row as i32
789+
&& ny >= 0
790+
&& ny < col as i32
791+
&& g[nx as usize][ny as usize] == 0
792+
{
793+
uf.union(x * col + y, nx as usize * col + ny as usize);
794+
}
795+
}
796+
797+
if x == 0 {
798+
uf.union(s, x * col + y);
799+
}
800+
if x == row - 1 {
801+
uf.union(t, x * col + y);
802+
}
803+
if uf.find(s) == uf.find(t) {
804+
return i;
805+
}
806+
i -= 1;
807+
}
808+
}
809+
}
810+
```
811+
662812
<!-- tabs:end -->
663813

664814
<!-- solution:end -->

solution/1900-1999/1970.Last Day Where You Can Still Cross/README_EN.md

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,67 @@ function latestDayToCross(row: number, col: number, cells: number[][]): number {
321321
}
322322
```
323323

324+
#### Rust
325+
326+
```rust
327+
use std::collections::VecDeque;
328+
329+
impl Solution {
330+
pub fn latest_day_to_cross(row: i32, col: i32, cells: Vec<Vec<i32>>) -> i32 {
331+
let mut l: i32 = 1;
332+
let mut r: i32 = cells.len() as i32;
333+
let m = row as usize;
334+
let n = col as usize;
335+
336+
let check = |k: i32, cells: &Vec<Vec<i32>>| -> bool {
337+
let mut g = vec![vec![0i32; n]; m];
338+
for i in 0..k as usize {
339+
let x = (cells[i][0] - 1) as usize;
340+
let y = (cells[i][1] - 1) as usize;
341+
g[x][y] = 1;
342+
}
343+
let dirs = [-1, 0, 1, 0, -1];
344+
let mut q: VecDeque<(usize, usize)> = VecDeque::new();
345+
for j in 0..n {
346+
if g[0][j] == 0 {
347+
q.push_back((0, j));
348+
g[0][j] = 1;
349+
}
350+
}
351+
while let Some((x, y)) = q.pop_front() {
352+
if x == m - 1 {
353+
return true;
354+
}
355+
for i in 0..4 {
356+
let nx = x as i32 + dirs[i];
357+
let ny = y as i32 + dirs[i + 1];
358+
if nx >= 0
359+
&& nx < m as i32
360+
&& ny >= 0
361+
&& ny < n as i32
362+
&& g[nx as usize][ny as usize] == 0
363+
{
364+
q.push_back((nx as usize, ny as usize));
365+
g[nx as usize][ny as usize] = 1;
366+
}
367+
}
368+
}
369+
false
370+
};
371+
372+
while l < r {
373+
let mid = (l + r + 1) >> 1;
374+
if check(mid, &cells) {
375+
l = mid;
376+
} else {
377+
r = mid - 1;
378+
}
379+
}
380+
l
381+
}
382+
}
383+
```
384+
324385
<!-- tabs:end -->
325386

326387
<!-- solution:end -->
@@ -660,6 +721,95 @@ function latestDayToCross(row: number, col: number, cells: number[][]): number {
660721
}
661722
```
662723

724+
#### Rust
725+
726+
```rust
727+
struct UnionFind {
728+
p: Vec<usize>,
729+
size: Vec<usize>,
730+
}
731+
732+
impl UnionFind {
733+
fn new(n: usize) -> Self {
734+
let mut p = vec![0; n];
735+
let mut size = vec![1; n];
736+
for i in 0..n {
737+
p[i] = i;
738+
}
739+
Self { p, size }
740+
}
741+
742+
fn find(&mut self, x: usize) -> usize {
743+
if self.p[x] != x {
744+
let px = self.p[x];
745+
self.p[x] = self.find(px);
746+
}
747+
self.p[x]
748+
}
749+
750+
fn union(&mut self, a: usize, b: usize) -> bool {
751+
let pa = self.find(a);
752+
let pb = self.find(b);
753+
if pa == pb {
754+
return false;
755+
}
756+
if self.size[pa] > self.size[pb] {
757+
self.p[pb] = pa;
758+
self.size[pa] += self.size[pb];
759+
} else {
760+
self.p[pa] = pb;
761+
self.size[pb] += self.size[pa];
762+
}
763+
true
764+
}
765+
}
766+
767+
impl Solution {
768+
pub fn latest_day_to_cross(row: i32, col: i32, cells: Vec<Vec<i32>>) -> i32 {
769+
let mn = cells.len();
770+
let mut uf = UnionFind::new(mn + 2);
771+
let s = mn;
772+
let t = mn + 1;
773+
let row = row as usize;
774+
let col = col as usize;
775+
776+
let mut g = vec![vec![1i32; col]; row];
777+
let dirs = [-1, 0, 1, 0, -1];
778+
779+
let mut i = mn as i32 - 1;
780+
loop {
781+
let x = (cells[i as usize][0] - 1) as usize;
782+
let y = (cells[i as usize][1] - 1) as usize;
783+
g[x][y] = 0;
784+
785+
for j in 0..4 {
786+
let nx = x as i32 + dirs[j];
787+
let ny = y as i32 + dirs[j + 1];
788+
if nx >= 0
789+
&& nx < row as i32
790+
&& ny >= 0
791+
&& ny < col as i32
792+
&& g[nx as usize][ny as usize] == 0
793+
{
794+
uf.union(x * col + y, nx as usize * col + ny as usize);
795+
}
796+
}
797+
798+
if x == 0 {
799+
uf.union(s, x * col + y);
800+
}
801+
if x == row - 1 {
802+
uf.union(t, x * col + y);
803+
}
804+
if uf.find(s) == uf.find(t) {
805+
return i;
806+
}
807+
i -= 1;
808+
}
809+
}
810+
}
811+
```
812+
663813
<!-- tabs:end -->
664814

665815
<!-- solution:end -->
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
use std::collections::VecDeque;
2+
3+
impl Solution {
4+
pub fn latest_day_to_cross(row: i32, col: i32, cells: Vec<Vec<i32>>) -> i32 {
5+
let mut l: i32 = 1;
6+
let mut r: i32 = cells.len() as i32;
7+
let m = row as usize;
8+
let n = col as usize;
9+
10+
let check = |k: i32, cells: &Vec<Vec<i32>>| -> bool {
11+
let mut g = vec![vec![0i32; n]; m];
12+
for i in 0..k as usize {
13+
let x = (cells[i][0] - 1) as usize;
14+
let y = (cells[i][1] - 1) as usize;
15+
g[x][y] = 1;
16+
}
17+
let dirs = [-1, 0, 1, 0, -1];
18+
let mut q: VecDeque<(usize, usize)> = VecDeque::new();
19+
for j in 0..n {
20+
if g[0][j] == 0 {
21+
q.push_back((0, j));
22+
g[0][j] = 1;
23+
}
24+
}
25+
while let Some((x, y)) = q.pop_front() {
26+
if x == m - 1 {
27+
return true;
28+
}
29+
for i in 0..4 {
30+
let nx = x as i32 + dirs[i];
31+
let ny = y as i32 + dirs[i + 1];
32+
if nx >= 0
33+
&& nx < m as i32
34+
&& ny >= 0
35+
&& ny < n as i32
36+
&& g[nx as usize][ny as usize] == 0
37+
{
38+
q.push_back((nx as usize, ny as usize));
39+
g[nx as usize][ny as usize] = 1;
40+
}
41+
}
42+
}
43+
false
44+
};
45+
46+
while l < r {
47+
let mid = (l + r + 1) >> 1;
48+
if check(mid, &cells) {
49+
l = mid;
50+
} else {
51+
r = mid - 1;
52+
}
53+
}
54+
l
55+
}
56+
}

0 commit comments

Comments
 (0)