0056 - Merge Intervals
description
Given an array of intervals
where intervals[i] = [starti, endi]
, merge all overlapping intervals, and return an array of the non-overlapping intervals that cover all the intervals in the input.
Example 1:
Input: intervals = [[1,3],[2,6],[8,10],[15,18]] Output: [[1,6],[8,10],[15,18]] Explanation: Since intervals [1,3] and [2,6] overlap, merge them into [1,6].
Example 2:
Input: intervals = [[1,4],[4,5]] Output: [[1,5]] Explanation: Intervals [1,4] and [4,5] are considered overlapping.
Example 3:
Input: intervals = [[4,7],[1,4]] Output: [[1,7]] Explanation: Intervals [1,4] and [4,7] are considered overlapping.
Constraints:
1 <= intervals.length <= 104
intervals[i].length == 2
0 <= starti <= endi <= 104
submission
impl Solution {
// intuition: sort and merge
// we iterate through the intervals, try merge them with the last
// element of the merged result, if they have overlap, merge them.
// add mut to intervals arg so we can sort them
pub fn merge(mut intervals: Vec<Vec<i32>>) -> Vec<Vec<i32>> {
// we must annotate this variable to compile
let mut ret: Vec<Vec<i32>> = vec![];
intervals.sort();
for interval in intervals {
match ret.last_mut() {
// if and only if merged vector have last element and it
// overlaps with the current interval, we can merge them.
Some(ref mut last) if interval[0] <= last[1] => {
last[1] = last[1].max(interval[1]);
}
// any other case, we can't merge them
_ => ret.push(interval),
}
}
ret
}
}