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