Skip to content

Commit ebb0948

Browse files
committed
Completed 'House Robber' and 'Remove Element'
1 parent 9edf888 commit ebb0948

File tree

5 files changed

+183
-3
lines changed

5 files changed

+183
-3
lines changed

Readme.md

+4-1
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,14 @@
1515
- **Bit Manipulation**
1616
- <span>190. Reverse Bits</span>
1717
- <span>191. Number of 1 Bits</span>
18+
- **Arrays**
19+
- <span>27. Remove Element</span>
1820
- **Strings**
1921
- <span>13. Roman to Integer</span>
2022
- <span>67. Add Binary</span>
2123
- **Dynamic Programming**
22-
- <span>70. climb Stairs</span>
24+
- <span>70. Climb Stairs</span>
25+
- <span>198. House Robber</span>
2326

2427
## Resources
2528

src/array/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
pub fn run() {}
2-
1+
pub mod p0027_remove_element;
32

3+
pub fn run() {}
44

55
const NUMERALS: [(char, u32); 7] = [
66
('I', 1),

src/array/p0027_remove_element.rs

+102
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
/*
2+
* Problem: 27. Remove Element (Easy)
3+
* URL: https://leetcode.com/problems/remove-element/
4+
*
5+
* Runtime: 1 ms (82.16%)
6+
* Memory Usage: 2.00 MB (57.82%)
7+
*/
8+
9+
10+
pub fn solve(nums: &mut Vec<i32>, val: i32) -> i32 {
11+
if nums.len() == 0 { return 0 }
12+
13+
let mut count = 0;
14+
15+
let mut lb = 0;
16+
let mut rb = nums.len()-1;
17+
18+
while lb <= rb {
19+
if nums[lb] != val {
20+
lb += 1;
21+
continue;
22+
}
23+
24+
if nums[rb] != val {
25+
nums[lb] = nums[rb];
26+
}
27+
28+
count += 1;
29+
30+
match rb.checked_sub(1) {
31+
None => break,
32+
Some(_) => rb -= 1
33+
}
34+
}
35+
36+
return i32::try_from(nums.len()).unwrap() - count;
37+
}
38+
39+
#[cfg(test)]
40+
mod remove_element_tests {
41+
use super::*;
42+
43+
#[test]
44+
fn happy_path() {
45+
let mut nums = vec![0,1,2,2,3,0,4,2];
46+
let val = 2;
47+
let remaining_count = usize::try_from(solve(&mut nums, val)).unwrap();
48+
49+
assert_eq!(remaining_count, 5);
50+
assert_eq!(nums[0..remaining_count], vec![0,1,4,0,3]);
51+
}
52+
53+
#[test]
54+
fn all_val() {
55+
let mut nums = vec![3,3,3,3,3];
56+
let val = 3;
57+
let remaining_count = usize::try_from(solve(&mut nums, val)).unwrap();
58+
59+
assert_eq!(remaining_count, 0);
60+
assert_eq!(nums[0..remaining_count], vec![]);
61+
}
62+
63+
#[test]
64+
fn last_val() {
65+
let mut nums = vec![3,3,3,3,4];
66+
let val = 3;
67+
let remaining_count = usize::try_from(solve(&mut nums, val)).unwrap();
68+
69+
assert_eq!(remaining_count, 1);
70+
assert_eq!(nums[0..remaining_count], vec![4]);
71+
}
72+
73+
#[test]
74+
fn no_val() {
75+
let mut nums = vec![50, 42];
76+
let val = 65;
77+
let remaining_count = usize::try_from(solve(&mut nums, val)).unwrap();
78+
79+
assert_eq!(remaining_count, 2);
80+
assert_eq!(nums[0..remaining_count], vec![50, 42]);
81+
}
82+
83+
#[test]
84+
fn more_val_than_remaining() {
85+
let mut nums = vec![2,2,2,5,5];
86+
let val = 2;
87+
let remaining_count = usize::try_from(solve(&mut nums, val)).unwrap();
88+
89+
assert_eq!(remaining_count, 2);
90+
assert_eq!(nums[0..remaining_count], vec![5,5]);
91+
}
92+
93+
#[test]
94+
fn val_sandwich() {
95+
let mut nums = vec![3,2,2,3];
96+
let val = 3;
97+
let remaining_count = usize::try_from(solve(&mut nums, val)).unwrap();
98+
99+
assert_eq!(remaining_count, 2);
100+
assert_eq!(nums[0..remaining_count], vec![2,2]);
101+
}
102+
}

src/dp/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
pub mod p0070_climbing_stairs;
2+
pub mod p0198_house_robber;
23

34
pub fn run() {}

src/dp/p0198_house_robber.rs

+74
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
use std::cmp;
2+
3+
/*
4+
* Problem: 198. House Robber (Medium)
5+
* URL: https://leetcode.com/problems/house-robber/
6+
*
7+
* Runtime: 0 ms (100%)
8+
* Memory Usage: 2.16 MB (23.83%)
9+
*/
10+
11+
pub fn solve(mut nums: Vec<i32>) -> i32 {
12+
if nums.len() < 2 { return nums[0] }
13+
14+
// Rob houses (fill memo)
15+
for house in (0..nums.len()-2).rev() {
16+
nums[house] = rob(house, &nums);
17+
}
18+
19+
return cmp::max(nums[0], nums[1]); // Return optimal loot
20+
}
21+
22+
fn rob(i: usize, nums: &Vec<i32>) -> i32 {
23+
return nums[i] + cmp::max(
24+
get_max_loot(i+2, &nums),
25+
get_max_loot(i+3, &nums)
26+
);
27+
}
28+
29+
fn get_max_loot(house: usize, nums: &Vec<i32>) -> i32 {
30+
return if(house > nums.len()-1) { 0 }
31+
else {
32+
nums[house]
33+
}
34+
}
35+
36+
#[cfg(test)]
37+
mod house_robber_tests {
38+
use super::*;
39+
40+
#[test]
41+
fn happy_path() {
42+
assert_eq!(solve(vec![2,7,9,3,1]), 12);
43+
}
44+
45+
#[test]
46+
fn start_at_2nd_house() {
47+
assert_eq!(solve(vec![1,3,1,1,1]), 4);
48+
}
49+
50+
#[test]
51+
fn skip_2() {
52+
assert_eq!(solve(vec![8,0,1,9,2]), 17);
53+
}
54+
55+
#[test]
56+
fn single_house() {
57+
assert_eq!(solve(vec![7]), 7);
58+
}
59+
60+
#[test]
61+
fn small_neighborhood() {
62+
assert_eq!(solve(vec![42, 53]), 53);
63+
}
64+
65+
#[test]
66+
fn large_neighborhood() {
67+
assert_eq!(solve(vec![114,117,207,117,235,82,90,67,143,146,53,108,200,91,80,223,58,170,110,236,81,90,222,160,165,195,187,199,114,235,197,187,69,129,64,214,228,78,188,67,205,94,205,169,241,202,144,240]),
68+
4173);
69+
}
70+
}
71+
72+
73+
74+

0 commit comments

Comments
 (0)