Skip to content

Commit 76bf4a1

Browse files
committed
Redo of Daily Temperatures (Much Faster)
1 parent 605b9a1 commit 76bf4a1

File tree

2 files changed

+20
-17
lines changed

2 files changed

+20
-17
lines changed

src/daily_temperatures.rs

+19-16
Original file line numberDiff line numberDiff line change
@@ -6,30 +6,33 @@
66
struct Solution;
77

88
impl Solution {
9-
fn has_lower_temp(temperatures: &Vec<i32>, stack: &Vec<usize>, temp: i32) -> bool {
10-
if stack.is_empty() {
11-
false
12-
} else {
13-
let last_index = stack.iter().last().unwrap();
14-
let last_temp = temperatures[*last_index];
15-
last_temp < temp
16-
}
17-
}
189

1910
pub fn daily_temperatures(temperatures: Vec<i32>) -> Vec<i32> {
20-
let mut stack = vec![];
21-
let mut result: Vec<i32> = vec![0; temperatures.len()];
22-
23-
for (i, temp) in temperatures.iter().enumerate() {
24-
while Self::has_lower_temp(&temperatures, &stack, *temp) {
25-
let j: usize = stack.pop().unwrap();
26-
result[j] = i as i32 - j as i32;
11+
let n = temperatures.len();
12+
let mut stack: Vec<usize> = Vec::new();
13+
let mut result = vec![0; n];
14+
15+
for i in 0..n {
16+
let current = temperatures[i];
17+
18+
while !stack.is_empty() {
19+
let n = stack.len();
20+
let index = stack[n-1];
21+
let previous = temperatures[index];
22+
if current > previous {
23+
result[index] = (i - index) as i32;
24+
stack.pop();
25+
} else {
26+
break;
27+
}
2728
}
29+
2830
stack.push(i);
2931
}
3032

3133
result
3234
}
35+
3336
}
3437

3538
#[cfg(test)]

src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -511,7 +511,7 @@ pub mod find_pivot_index; // 724 ✓
511511
pub mod sentence_similarity; // 734 ✓
512512
pub mod asteroid_collision; // 735 ✓
513513

514-
pub mod daily_temperatures; // 739
514+
pub mod daily_temperatures; // 739
515515
pub mod delete_and_earn; // 740 ✓
516516

517517
pub mod network_delay_time; // 743 ✓

0 commit comments

Comments
 (0)