Skip to content

Commit ee467e6

Browse files
committed
feat: medium: find_closest_node_to_given_two_nodes.rs
1 parent 85b73db commit ee467e6

File tree

2 files changed

+64
-0
lines changed

2 files changed

+64
-0
lines changed
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
struct Solution;
2+
3+
impl Solution {
4+
fn traverse(edges: &[i32], start_node: usize) -> Vec<i32> {
5+
let mut distances = vec![-1; edges.len()];
6+
let mut current = start_node;
7+
let mut distance = 0;
8+
9+
while distances[current] == -1 {
10+
distances[current] = distance;
11+
let idx = edges[current];
12+
if idx == -1 {
13+
break;
14+
}
15+
current = idx as usize;
16+
distance += 1;
17+
}
18+
19+
distances
20+
}
21+
22+
// https://leetcode.com/problems/find-closest-node-to-given-two-nodes
23+
// I am doing this again...
24+
pub fn closest_meeting_node(edges: Vec<i32>, node1: i32, node2: i32) -> i32 {
25+
let node1_distances = Self::traverse(&edges, node1 as usize);
26+
let node2_distances = Self::traverse(&edges, node2 as usize);
27+
28+
let mut candidate: i32 = -1;
29+
let mut min_distance = i32::MAX;
30+
31+
for i in 0..edges.len() {
32+
if node1_distances[i] == -1 || node2_distances[i] == -1 {
33+
continue;
34+
}
35+
36+
let distance = node2_distances[i].max(node1_distances[i]);
37+
if distance < min_distance {
38+
candidate = i as i32;
39+
min_distance = distance;
40+
}
41+
}
42+
43+
candidate
44+
}
45+
}
46+
47+
#[test]
48+
fn test() {
49+
let test_cases = vec![
50+
(vec![2, 2, 3, -1], 0, 1, 2),
51+
(vec![1, 2, -1], 0, 2, 2),
52+
(vec![4, 4, 4, 5, 1, 2, 2], 1, 1, 1),
53+
(vec![5, 3, 1, 0, 2, 4, 5], 3, 2, 3),
54+
];
55+
56+
for (edges, node1, node2, expected) in test_cases {
57+
assert_eq!(
58+
Solution::closest_meeting_node(edges.clone(), node1, node2),
59+
expected,
60+
"closest_meeting_node: failed for edges: {edges:?}, node1 {node1} node2 {node2}",
61+
);
62+
}
63+
}

src/medium/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ mod design_a_number_container_system;
1616
mod distant_barcodes;
1717
mod domino_and_tromino_tiling;
1818
mod evaluate_reverse_polish_notation;
19+
mod find_closest_node_to_given_two_nodes;
1920
mod find_eventual_safe_states;
2021
mod find_peak_element;
2122
mod find_the_number_of_distinct_colors_among_the_balls;

0 commit comments

Comments
 (0)