Merge Intervals
Question (LC.56)
Give a list of time intervals, return a list of merged time intervals.
Example
I: [[1,3], [2,6], [8,10], [15,18]]
O: [[1,6], [8,10], [15,18]]
I: [[3,4], [1,5]]
O: [[1,5]]
The input is not sorted.
Approach
Sort by start time. Scan from left to right keep a start and end for merged interval. Update the end time (make sure it's larger) until no intersecting intervals.
Code
public List<Interval> merge(List<Interval> intervals) {
List<Interval> results = new ArrayList<>();
// edge check
if (intervals == null || intervals.size() == 0) {
return results;
}
// sort by start time
Collections.sort(intervals, (Interval i1, Interval i2) -> i1.start - i2.start);
// scan sorted intervals
int mergeStartTime = intervals.get(0).start;
int mergeEndTime = intervals.get(0).end;
for (Interval intv : intervals) {
if (intv.start <= mergeEndTime) {
mergeEndTime = Math.max(mergeEndTime, intv.end);
} else {
results.add(new Interval(mergeStartTime, mergeEndTime));
mergeStartTime = intv.start;
mergeEndTime = intv.end;
}
}
results.add(new Interval(mergeStartTime, mergeEndTime));
return results;
}
Complexity
Time O(nlogn) + O(n) Space O(1)
Last updated