Skip to content

Commit ef38b50

Browse files
committed
Added Insert Interval
1 parent d077115 commit ef38b50

File tree

2 files changed

+122
-0
lines changed

2 files changed

+122
-0
lines changed

Diff for: src/insert_interval.rs

+121
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
2+
enum State {
3+
Before,
4+
Within,
5+
After,
6+
}
7+
8+
/// You are given an array of non-overlapping intervals `intervals` where `intervals[i] = [starti,
9+
/// endi]` represent the start and end of the `ith` interval and `intervals` is sorted in ascending
10+
/// order by `starti`. You are also given an interval `newInterval = [start, end]` that represents
11+
/// the start and end of another interval.
12+
///
13+
/// Insert `newInterval` into `intervals` such that `intervals` is still stored in ascending order
14+
/// by `starti` and `intervals` still does not have any overlapping intervals (merge overlapping
15+
/// intervals if necessary).
16+
///
17+
/// Return `intervals` after the insertion.
18+
struct Solution;
19+
20+
impl Solution {
21+
22+
pub fn insert(intervals: Vec<Vec<i32>>, new_interval: Vec<i32>) -> Vec<Vec<i32>> {
23+
let mut state = State::Before;
24+
let mut results = Vec::new();
25+
26+
let n = intervals.len();
27+
28+
let new_begin = new_interval[0];
29+
let new_end = new_interval[1];
30+
31+
let mut combined_begin = new_begin;
32+
let mut combined_end = new_end;
33+
34+
println!("{:?}", new_interval);
35+
36+
for i in 0..n {
37+
let current = &intervals[i];
38+
let current_begin = current[0];
39+
let current_end = current[1];
40+
41+
println!("{:?} {:?}", current, state);
42+
if state == State::Before {
43+
if new_begin < current_begin {
44+
if new_end < current_begin {
45+
state = State::After;
46+
results.push(vec![new_begin, new_end]);
47+
results.push(current.clone());
48+
} else if new_end <= current_end {
49+
state = State::After;
50+
results.push(vec![new_begin, current_end]);
51+
} else {
52+
state = State::Within;
53+
combined_begin = new_begin;
54+
combined_end = new_end.max(current_end);
55+
}
56+
} else if new_begin <= current_end {
57+
if new_end <= current_end {
58+
state = State::After;
59+
results.push(vec![current_begin, current_end]);
60+
} else {
61+
state = State::Within;
62+
combined_begin = current_begin;
63+
combined_end = new_end;
64+
}
65+
} else {
66+
results.push(current.clone());
67+
}
68+
} else if state == State::Within {
69+
if combined_end < current_begin {
70+
state = State::After;
71+
results.push(vec![combined_begin, combined_end]);
72+
results.push(current.clone());
73+
} else if combined_end <= current_end {
74+
state = State::After;
75+
results.push(vec![combined_begin, current_end]);
76+
} else {
77+
// Keep Going
78+
}
79+
} else {
80+
results.push(current.clone());
81+
}
82+
}
83+
84+
if state != State::After {
85+
results.push(vec![combined_begin, combined_end]);
86+
}
87+
88+
results
89+
}
90+
91+
}
92+
93+
#[cfg(test)]
94+
mod tests {
95+
use super::Solution;
96+
97+
#[test]
98+
fn example_1() {
99+
let intervals = vec![vec![1,3], vec![6,9]];
100+
let new_interval = vec![2,5];
101+
let result = Solution::insert(intervals, new_interval);
102+
assert_eq!(result, vec![vec![1,5], vec![6,9]]);
103+
}
104+
105+
#[test]
106+
fn example_2() {
107+
let intervals = vec![vec![1,2], vec![3,5], vec![6,7], vec![8,10], vec![12,16]];
108+
let new_interval = vec![4,8];
109+
let result = Solution::insert(intervals, new_interval);
110+
assert_eq!(result, vec![vec![1,2], vec![3,10], vec![12,16]]);
111+
}
112+
113+
#[test]
114+
fn example_3() {
115+
let intervals = vec![];
116+
let new_interval = vec![5,7];
117+
let result = Solution::insert(intervals, new_interval);
118+
assert_eq!(result, vec![vec![5,7]]);
119+
}
120+
121+
}

Diff for: src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ pub mod maximum_subarray; // 53 ✓
6969

7070
pub mod jump_game; // 55 ✓
7171

72+
pub mod insert_interval; // 57 ✓
7273
pub mod length_of_last_word; // 58
7374

7475
pub mod unique_paths; // 62 ✓

0 commit comments

Comments
 (0)