Skip to content

Commit 9edf888

Browse files
committed
Completed '70. Climbing Stairs'
1 parent 568f2da commit 9edf888

File tree

8 files changed

+162
-37
lines changed

8 files changed

+162
-37
lines changed

Readme.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
- **Strings**
1919
- <span>13. Roman to Integer</span>
2020
- <span>67. Add Binary</span>
21+
- **Dynamic Programming**
22+
- <span>70. climb Stairs</span>
2123

2224
## Resources
2325

src/array/mod.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,13 @@
1-
pub fn run() {
2-
}
1+
pub fn run() {}
2+
3+
4+
5+
const NUMERALS: [(char, u32); 7] = [
6+
('I', 1),
7+
('V', 5),
8+
('X', 10),
9+
('L', 50),
10+
('C', 100),
11+
('D', 500),
12+
('M', 1000),
13+
];

src/bit_manipulation/mod.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
pub mod p0190_reverse_bits;
22
pub mod p0191_count_set_bits;
33

4-
pub fn run() {
5-
}
4+
pub fn run() {}

src/dp/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
pub mod p0070_climbing_stairs;
2+
3+
pub fn run() {}

src/dp/p0070_climbing_stairs.rs

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/*
2+
* Problem: 70. Climbing Stairs (Easy)
3+
* URL: https://leetcode.com/problems/climbing-stairs/
4+
*
5+
* Runtime: 0 ms (100%)
6+
* Memory Usage: 2.01 MB (53.39%)
7+
*/
8+
9+
static mut MEMO: [i32; 45] = [-1; 45];
10+
11+
pub fn solve(n: i32) -> i32 {
12+
return descend(i8::try_from(n).unwrap());
13+
}
14+
15+
fn descend(n: i8) -> i32 {
16+
if n < 0 { return 0 }
17+
if n == 0 { return 1 }
18+
19+
let step = usize::try_from(n).unwrap() - 1;
20+
unsafe {
21+
if MEMO[step] != -1 { return MEMO[step] }
22+
}
23+
24+
let mut combos = 0;
25+
26+
combos += descend(n-1);
27+
combos += descend(n-2);
28+
29+
unsafe {
30+
if MEMO[step] == -1 { MEMO[step] = combos; }
31+
}
32+
33+
return combos;
34+
}
35+
36+
#[cfg(test)]
37+
mod climbing_stairs_tests {
38+
use super::*;
39+
40+
#[test]
41+
fn stair_count_1() {
42+
assert_eq!(solve(1), 1);
43+
}
44+
45+
#[test]
46+
fn stair_count_7() {
47+
assert_eq!(solve(7), 21);
48+
}
49+
50+
#[test]
51+
fn stair_count_12() {
52+
assert_eq!(solve(12), 233);
53+
}
54+
55+
#[test]
56+
fn stair_count_22() {
57+
assert_eq!(solve(22), 28_657);
58+
}
59+
60+
#[test]
61+
fn stair_count_38() {
62+
assert_eq!(solve(38), 63_245_986);
63+
}
64+
65+
#[test]
66+
fn stair_count_45() {
67+
assert_eq!(solve(45), 1_836_311_903);
68+
}
69+
}

src/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ pub mod math;
44
pub mod bit_manipulation;
55
pub mod array;
66
pub mod string;
7+
pub mod dp;
78

89
fn main() {
910
// array::run();

src/math/mod.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
11
pub mod p0069_sqrt;
22

3-
pub fn run() {
4-
}
3+
pub fn run() {}

src/string/p0013_roman_to_int.rs

Lines changed: 72 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,45 @@ use phf::phf_map;
88
* URL: https://leetcode.com/problems/roman-to-integer/
99
*
1010
* Runtime: 0 ms (100%)
11-
* Memory Usage: 2.32 MB (10.58%)
11+
* Memory Usage: 2.06 MB (63.81%)
1212
*/
1313

14-
const NUMERALS: [(char, u32); 7] = [
15-
('I', 1),
16-
('V', 5),
17-
('X', 10),
18-
('L', 50),
19-
('C', 100),
20-
('D', 500),
21-
('M', 1000),
22-
];
23-
2414
pub fn solve(s: &str) -> i32 {
15+
let map: HashMap<char, i32> = HashMap::from([
16+
('I', 1),
17+
('V', 5),
18+
('X', 10),
19+
('L', 50),
20+
('C', 100),
21+
('D', 500),
22+
('M', 1000)
23+
]);
24+
let mut result = 0;
25+
let mut previous = '0';
26+
let mut subtract_previous = false;
27+
28+
for (i, roman) in s.chars().enumerate() {
29+
let val = map.get(&roman).unwrap();
30+
31+
if subtract_previous {
32+
result += val - map.get(&previous).unwrap();
33+
subtract_previous = false;
34+
continue;
35+
}
36+
37+
if i+1 < s.len() && val < map.get(&(s.get(i+1..i+2).unwrap().as_bytes()[0] as char)).unwrap() {
38+
subtract_previous = true;
39+
} else {
40+
result += val;
41+
}
42+
43+
previous = roman;
44+
}
45+
46+
return result;
47+
}
48+
49+
pub fn solve_rev(s: &str) -> i32 {
2550
let map: HashMap<char, i32> = HashMap::from([
2651
('I', 1),
2752
('V', 5),
@@ -32,29 +57,24 @@ pub fn solve(s: &str) -> i32 {
3257
('M', 1000)
3358
]);
3459
let mut result = 0;
35-
let mut subtract_previous = false;
3660

37-
for (i, char) in s.chars().enumerate() {
38-
let val = map.get(&char).unwrap();
61+
let mut previous = 0;
3962

40-
if subtract_previous {
41-
result += val - map.get(&(s.get(i-1..i).unwrap().as_bytes()[0] as char)).unwrap();
42-
subtract_previous = false;
43-
continue;
44-
}
63+
for (i, roman) in s.chars().rev().enumerate() {
64+
let val = map.get(&roman).unwrap();
4565

46-
if i+1 < s.len() && val < map.get(&(s.get(i+1..i+2).unwrap().as_bytes()[0] as char)).unwrap() {
47-
subtract_previous = true;
48-
} else {
49-
result += val;
66+
if val < &previous {
67+
result -= val
5068
}
69+
else { result += val }
5170

71+
previous = val.clone();
5272
}
5373

54-
result
74+
return result;
5575
}
5676

57-
pub fn solve_phf(s: String) -> i32 {
77+
pub fn solve_phf(s: &str) -> i32 {
5878
let mut result: i32 = 0;
5979

6080
let mut buf = [0; 1];
@@ -111,17 +131,38 @@ mod roman_to_int_tests {
111131
use super::*;
112132

113133
#[test]
114-
fn happy_path() {
115-
assert_eq!(solve("LVIII"), 58);
134+
fn roman_i() {
135+
let roman_numeral = "I";
136+
let ans = 1;
137+
assert_eq!(solve(roman_numeral), ans);
138+
assert_eq!(solve_rev(roman_numeral), ans);
139+
assert_eq!(solve_phf(roman_numeral), ans);
140+
}
141+
142+
#[test]
143+
fn roman_lviii() {
144+
let roman_numeral = "LVIII";
145+
let ans = 58;
146+
assert_eq!(solve(roman_numeral), ans);
147+
assert_eq!(solve_rev(roman_numeral), ans);
148+
assert_eq!(solve_phf(roman_numeral), ans);
116149
}
117150

118151
#[test]
119-
fn subtraction_before_additions() {
120-
assert_eq!(solve("XLII"), 42);
152+
fn roman_xlii() {
153+
let roman_numeral = "XLII";
154+
let ans = 42;
155+
assert_eq!(solve(roman_numeral), ans);
156+
assert_eq!(solve_rev(roman_numeral), ans);
157+
assert_eq!(solve_phf(roman_numeral), ans);
121158
}
122159

123160
#[test]
124-
fn multiple_subtractions() {
125-
assert_eq!(solve("MCMXCIV"), 1994);
161+
fn roman_mcmxciv() {
162+
let roman_numeral = "MCMXCIV";
163+
let ans = 1994;
164+
assert_eq!(solve(roman_numeral), ans);
165+
assert_eq!(solve_rev(roman_numeral), ans);
166+
assert_eq!(solve_phf(roman_numeral), ans);
126167
}
127168
}

0 commit comments

Comments
 (0)