Skip to content

Commit 85d5677

Browse files
committed
Added Employee Free Time
1 parent 18009d0 commit 85d5677

File tree

3 files changed

+138
-1
lines changed

3 files changed

+138
-1
lines changed

src/employee_free_time.rs

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
use crate::interval::Interval;
2+
use std::cmp::Reverse;
3+
use std::collections::BinaryHeap;
4+
5+
/// We are given a list `schedule` of employees, which represents the working time for each
6+
/// employee.
7+
///
8+
/// Each employee has a list of non-overlapping `Intervals`, and these intervals are in sorted
9+
/// order.
10+
///
11+
/// Return the list of finite intervals representing common, positive-length free time for all
12+
/// employees, also in sorted order.
13+
struct Solution;
14+
15+
impl Solution {
16+
17+
pub fn employee_free_time(schedule: Vec<Vec<Interval>>) -> Vec<Interval> {
18+
let mut min_heap: BinaryHeap<Reverse<(i32, i32)>> = BinaryHeap::new();
19+
20+
for employee in schedule {
21+
for block in employee {
22+
let item = (block.start, block.end);
23+
min_heap.push(Reverse(item));
24+
}
25+
}
26+
27+
let mut results = vec![];
28+
let mut start = -1;
29+
30+
while !min_heap.is_empty() {
31+
let item = min_heap.pop().unwrap().0;
32+
let item_start = item.0;
33+
let item_end = item.1;
34+
35+
if start == -1 {
36+
// intialization
37+
start = item_end;
38+
} else if start >= item_start {
39+
// covered, extend next good interval if necessary
40+
start = start.max(item_end);
41+
} else {
42+
// open space
43+
let end = item_start;
44+
let diff = end - start;
45+
if diff > 0 {
46+
let interval = Interval::new(start, end);
47+
results.push(interval);
48+
}
49+
start = item_end;
50+
}
51+
}
52+
53+
results
54+
}
55+
56+
}
57+
58+
#[cfg(test)]
59+
mod tests {
60+
use crate::interval::Interval;
61+
use super::Solution;
62+
63+
#[test]
64+
fn example_1() {
65+
let schedule = vec![
66+
vec![
67+
Interval::new(1, 2),
68+
Interval::new(5, 6),
69+
],
70+
vec![
71+
Interval::new(1, 3),
72+
Interval::new(4, 10),
73+
]
74+
];
75+
let results = Solution::employee_free_time(schedule);
76+
assert_eq!(results.len(), 1);
77+
assert_eq!(results, vec![Interval::new(3,4)]);
78+
}
79+
80+
#[test]
81+
fn example_2() {
82+
let schedule = vec![
83+
vec![
84+
Interval::new(1,3),
85+
Interval::new(6,7),
86+
],
87+
vec![
88+
Interval::new(2,4),
89+
],
90+
vec![
91+
Interval::new(2,5),
92+
Interval::new(9,12),
93+
]
94+
];
95+
let results = Solution::employee_free_time(schedule);
96+
assert_eq!(results.len(), 2);
97+
assert_eq!(results, vec![Interval::new(5,6), Interval::new(7,9)]);
98+
}
99+
100+
#[test]
101+
fn example_3() {
102+
let schedule = vec![
103+
vec![
104+
Interval::new(45,56),
105+
Interval::new(89,96),
106+
],
107+
vec![
108+
Interval::new(5,21),
109+
Interval::new(57,74),
110+
],
111+
];
112+
let results = Solution::employee_free_time(schedule);
113+
assert_eq!(results.len(), 3);
114+
assert_eq!(results, vec![
115+
Interval::new(21,45),
116+
Interval::new(56,57),
117+
Interval::new(74,89),
118+
]);
119+
}
120+
121+
}

src/interval.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#[derive(PartialEq, Eq, Clone, Debug)]
2+
pub struct Interval {
3+
pub start: i32,
4+
pub end: i32
5+
}
6+
7+
impl Interval {
8+
#[inline]
9+
pub fn new(start: i32, end: i32) -> Self {
10+
Self {
11+
start,
12+
end
13+
}
14+
}
15+
}

src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ macro_rules! assert_tree {
2727
};
2828
}
2929

30+
pub mod interval;
3031
pub mod kth_largest;
3132
pub mod lowercase_letter_counter;
3233
pub mod list_node;
@@ -542,7 +543,7 @@ pub mod min_cost_climbing_stairs; // 746
542543
pub mod open_the_lock; // 752 ✓
543544

544545
pub mod bold_words_in_string; // 758 ✓
545-
546+
pub mod employee_free_time; // 759 ✓
546547
pub mod find_anagram_mappings; // 760 ✓
547548

548549
pub mod jewels_and_stones; // 771

0 commit comments

Comments
 (0)