Skip to content

Commit 1bf271c

Browse files
committed
Add solutions
1 parent fa5f23b commit 1bf271c

11 files changed

+380
-0
lines changed

src/leetcode/interview/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
mod amazon;
22
mod robinhood;
3+
mod uber;

src/leetcode/interview/uber/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
automod::dir!("src/leetcode/interview/uber");
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
use std::collections::{HashMap, HashSet, VecDeque};
2+
3+
// 815. Bus Routes, Hard
4+
// https://leetcode.com/problems/bus-routes/
5+
impl Solution {
6+
pub fn num_buses_to_destination(routes: Vec<Vec<i32>>, source: i32, target: i32) -> i32 {
7+
let mut hm: HashMap<i32, Vec<(i32, i32)>> = HashMap::new();
8+
9+
for (bus, route) in routes.iter().enumerate() {
10+
let bus = bus as i32;
11+
12+
let mut route = route.clone();
13+
route.push(route[0]);
14+
15+
for j in 0..route.len() - 1 {
16+
let j = j as i32;
17+
hm.entry(route[j as usize])
18+
.and_modify(|f| f.push((route[j as usize + 1], bus)))
19+
.or_insert(vec![(route[j as usize + 1], bus)]);
20+
}
21+
}
22+
23+
let mut queue: VecDeque<(i32, HashSet<i32>)> = VecDeque::new();
24+
queue.push_back((source, HashSet::<i32>::new()));
25+
26+
let mut seen: HashSet<i32> = HashSet::new();
27+
28+
let mut min_busses = usize::MAX;
29+
30+
while !queue.is_empty() {
31+
let (stop, busses) = queue.pop_front().unwrap();
32+
33+
if stop == target {
34+
min_busses = min_busses.min(busses.len());
35+
}
36+
37+
seen.insert(stop);
38+
39+
for edge in hm.get(&stop).unwrap_or(&vec![]) {
40+
if seen.contains(&edge.0) {
41+
continue;
42+
}
43+
44+
let mut busses = busses.clone();
45+
busses.insert(edge.1);
46+
queue.push_back((edge.0, busses));
47+
}
48+
}
49+
50+
min_busses as i32
51+
}
52+
}
53+
54+
struct Solution {}
55+
56+
#[cfg(test)]
57+
mod tests {
58+
use super::*;
59+
use crate::vec_vec_i32;
60+
61+
#[test]
62+
fn test_num_buses_to_destination() {
63+
assert_eq!(Solution::num_buses_to_destination(vec_vec_i32![[1, 2, 7], [3, 6, 7]], 1, 6), 2);
64+
}
65+
66+
#[test]
67+
fn test_num_buses_to_destination2() {
68+
assert_eq!(
69+
Solution::num_buses_to_destination(vec_vec_i32![[7, 12], [4, 5, 15], [6], [15, 19], [9, 12, 13]], 15, 12),
70+
-1
71+
);
72+
}
73+
}

src/leetcode/problem/can_construct.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
use std::collections::HashMap;
2+
3+
// 1400. Construct K Palindrome Strings, Medium
4+
// https://leetcode.com/problems/construct-k-palindrome-strings/
5+
impl Solution {
6+
pub fn can_construct(s: String, k: i32) -> bool {
7+
let mut counter: HashMap<char, i32> = HashMap::new();
8+
9+
let n = s.len() as i32;
10+
for ch in s.chars() {
11+
counter.entry(ch).and_modify(|c| *c += 1).or_insert(1);
12+
}
13+
14+
let mut odds = 0;
15+
16+
for (_k, v) in counter {
17+
if v % 2 != 0 {
18+
odds += 1;
19+
}
20+
}
21+
22+
return n >= k && odds <= k;
23+
}
24+
}
25+
26+
struct Solution {}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// 986. Interval List Intersections, Medium
2+
// https://leetcode.com/problems/interval-list-intersections/
3+
impl Solution {
4+
pub fn interval_intersection(first_list: Vec<Vec<i32>>, second_list: Vec<Vec<i32>>) -> Vec<Vec<i32>> {
5+
let mut ans: Vec<Vec<i32>> = vec![];
6+
7+
let (mut i, mut j) = (0, 0);
8+
9+
while i < first_list.len() && j < second_list.len() {
10+
let start = i32::max(first_list[i][0], second_list[j][0]);
11+
let end = i32::min(first_list[i][1], second_list[j][1]);
12+
13+
if start <= end {
14+
ans.push(vec![start, end]);
15+
}
16+
17+
if first_list[i][1] < second_list[j][1] {
18+
i += 1;
19+
} else {
20+
j += 1;
21+
}
22+
}
23+
24+
ans
25+
}
26+
}
27+
28+
struct Solution {}

src/leetcode/problem/is_cousins.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#[derive(Debug, PartialEq, Eq)]
2+
pub struct TreeNode {
3+
pub val: i32,
4+
pub left: Option<Rc<RefCell<TreeNode>>>,
5+
pub right: Option<Rc<RefCell<TreeNode>>>,
6+
}
7+
8+
impl TreeNode {
9+
#[inline]
10+
pub fn new(val: i32) -> Self {
11+
TreeNode { val, left: None, right: None }
12+
}
13+
}
14+
15+
use std::cell::RefCell;
16+
use std::rc::Rc;
17+
18+
// 993. Cousins in Binary Tree, Easy
19+
// https://leetcode.com/problems/cousins-in-binary-tree/
20+
impl Solution {
21+
pub fn is_cousins(root: Option<Rc<RefCell<TreeNode>>>, x: i32, y: i32) -> bool {
22+
let mut found: Vec<(i32, i32)> = vec![]; // (parent, level)
23+
24+
fn bfs(node: Option<Rc<RefCell<TreeNode>>>, x: &i32, y: &i32, parent: i32, level: i32, found: &mut Vec<(i32, i32)>) {
25+
if node.is_some() {
26+
let node = node.as_ref().unwrap().borrow();
27+
28+
if found.len() == 2 {
29+
return;
30+
}
31+
32+
if node.val == *x || node.val == *y {
33+
found.push((parent, level));
34+
return;
35+
}
36+
37+
bfs(node.left.clone(), &x, &y, node.val, level + 1, found);
38+
bfs(node.right.clone(), &x, &y, node.val, level + 1, found);
39+
}
40+
}
41+
42+
bfs(root, &x, &y, -1, 0, &mut found);
43+
44+
found.len() == 2 && found[0].0 != found[1].0 && found[0].1 == found[1].1
45+
}
46+
}
47+
48+
struct Solution {}

src/leetcode/problem/min_transfers.rs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
use std::collections::HashMap;
2+
3+
// 465. Optimal Account Balancing, Hard
4+
// https://leetcode.com/problems/optimal-account-balancing/
5+
impl Solution {
6+
pub fn min_transfers(transactions: Vec<Vec<i32>>) -> i32 {
7+
let mut hm = HashMap::new();
8+
9+
for transaction in transactions.iter() {
10+
let (from, to, amount) = (transaction[0], transaction[1], transaction[2]);
11+
hm.entry(from).and_modify(|d| *d -= amount).or_insert(-amount);
12+
hm.entry(to).and_modify(|d| *d += amount).or_insert(amount);
13+
}
14+
15+
let mut debts = vec![];
16+
for v in hm.values() {
17+
debts.push(*v);
18+
}
19+
20+
fn dfs(debts: &mut Vec<i32>, mut i: usize) -> i32 {
21+
while i < debts.len() && debts[i] == 0 {
22+
i += 1;
23+
}
24+
25+
let mut ans = i32::MAX;
26+
let mut prev = 0;
27+
for j in i + 1..debts.len() {
28+
if debts[j] != prev && debts[j] * debts[i] < 0 {
29+
debts[j] += debts[i];
30+
ans = i32::min(ans, 1 + dfs(debts, i + 1));
31+
debts[j] -= debts[i];
32+
prev = debts[j];
33+
}
34+
}
35+
36+
if ans < i32::MAX {
37+
ans
38+
} else {
39+
0
40+
}
41+
}
42+
43+
dfs(&mut debts, 0)
44+
}
45+
}
46+
47+
struct Solution {}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
use std::collections::{HashMap, VecDeque};
2+
3+
// 496. Next Greater Element I, Easy
4+
// https://leetcode.com/problems/next-greater-element-i/
5+
impl Solution {
6+
pub fn next_greater_element(nums1: Vec<i32>, nums2: Vec<i32>) -> Vec<i32> {
7+
let mut queue = VecDeque::new();
8+
let mut nums2_next_bigger = HashMap::new();
9+
10+
for (i, curr_num) in nums2.iter().enumerate() {
11+
while queue.len() > 0 && *queue.back().unwrap() < curr_num {
12+
let num = queue.pop_back().unwrap();
13+
nums2_next_bigger.insert(num, *curr_num);
14+
}
15+
queue.push_back(curr_num);
16+
}
17+
18+
queue.iter().for_each(|k| {
19+
nums2_next_bigger.insert(*k, -1);
20+
});
21+
22+
let mut ans = vec![];
23+
24+
'outer: for i in 0..nums1.len() {
25+
for j in 0..nums2.len() {
26+
if nums1[i] == nums2[j] {
27+
ans.push(*nums2_next_bigger.get(&nums2[j]).unwrap());
28+
continue 'outer;
29+
}
30+
}
31+
}
32+
33+
ans
34+
}
35+
36+
pub fn next_greater_element_slow(nums1: Vec<i32>, nums2: Vec<i32>) -> Vec<i32> {
37+
let mut ans = vec![];
38+
39+
'outer: for i in 0..nums1.len() {
40+
let mut found = -1;
41+
let mut found_i = -1;
42+
43+
for j in i + 1..nums2.len() {
44+
if nums1[i] == nums2[j] {
45+
found = nums2[j];
46+
found_i = j as i32;
47+
break;
48+
}
49+
}
50+
51+
if found_i != -1 {
52+
let found_i = found_i as usize;
53+
for i in found_i + 1..nums2.len() {
54+
if found < nums2[i] {
55+
ans.push(nums2[i]);
56+
continue 'outer;
57+
}
58+
}
59+
}
60+
61+
ans.push(-1);
62+
}
63+
64+
ans
65+
}
66+
}
67+
68+
struct Solution {}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// 764. Largest Plus Sign, Medium
2+
// https://leetcode.com/problems/largest-plus-sign/
3+
impl Solution {
4+
pub fn order_of_largest_plus_sign(n: i32, mines: Vec<Vec<i32>>) -> i32 {
5+
let n = n as usize;
6+
let mut grid = vec![vec![0; n]; n];
7+
8+
for mine in mines.iter() {
9+
grid[mine[0] as usize][mine[1] as usize] = 1;
10+
}
11+
12+
let mut prefix_sum_grid = vec![vec![i32::MAX; n]; n];
13+
14+
for i in 0..n {
15+
let mut sum_right = 0;
16+
let mut sum_left = 0;
17+
let mut sum_down = 0;
18+
let mut sum_up = 0;
19+
20+
for j in 0..n {
21+
sum_right += grid[i][j];
22+
prefix_sum_grid[i][j] += i32::min(prefix_sum_grid[i][j], sum_right);
23+
24+
sum_left += grid[i][n - j - 1];
25+
prefix_sum_grid[i][n - j - 1] += i32::min(prefix_sum_grid[i][n - j - 1], sum_left);
26+
27+
sum_down += grid[j][i];
28+
prefix_sum_grid[j][i] += i32::min(prefix_sum_grid[j][i], sum_down);
29+
30+
sum_up += grid[n - j - 1][i];
31+
prefix_sum_grid[n - j - 1][i] += i32::min(prefix_sum_grid[n - j - 1][i], sum_up);
32+
}
33+
}
34+
35+
let mut ans = 0;
36+
for i in 0..n {
37+
for j in 0..n {
38+
ans = i32::max(ans, prefix_sum_grid[i][j]);
39+
}
40+
}
41+
42+
ans
43+
}
44+
}
45+
46+
struct Solution {}

src/leetcode/problem/restore_array.rs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
use std::collections::{HashMap, HashSet};
2+
3+
// 1743. Restore the Array From Adjacent Pairs, Medium
4+
// https://leetcode.com/problems/restore-the-array-from-adjacent-pairs/
5+
impl Solution {
6+
pub fn restore_array(adjacent_pairs: Vec<Vec<i32>>) -> Vec<i32> {
7+
let mut graph: HashMap<i32, Vec<i32>> = HashMap::new();
8+
9+
for pair in adjacent_pairs.iter() {
10+
let (u, v) = (pair[0], pair[1]);
11+
graph.entry(u).and_modify(|e| e.push(v)).or_insert(vec![v]);
12+
graph.entry(v).and_modify(|e| e.push(u)).or_insert(vec![u]);
13+
}
14+
15+
let n = adjacent_pairs.len() + 1;
16+
let mut ans = vec![];
17+
18+
let mut head_cands = graph.iter().map(|(k, v)| (*k, v.len())).collect::<Vec<(i32, usize)>>();
19+
head_cands.sort_by_key(|(_, v)| *v);
20+
21+
let mut head = head_cands.first().unwrap().0;
22+
let mut seen = HashSet::<i32>::new();
23+
24+
while ans.len() < n {
25+
seen.insert(head);
26+
ans.push(head);
27+
28+
let cands = graph.get(&head).unwrap();
29+
for cand in cands.iter() {
30+
if !seen.contains(&cand) {
31+
seen.insert(*cand);
32+
head = *cand;
33+
break;
34+
}
35+
}
36+
}
37+
38+
ans
39+
}
40+
}
41+
42+
struct Solution {}

0 commit comments

Comments
 (0)