56. Merge Intervals
Given a collection of intervals, merge all overlapping intervals.
For example,
Given[1,3],[2,6],[8,10],[15,18],
return[1,6],[8,10],[15,18].
Analysis:
Make a comparator, sort intervals by start.
iterate through all intervals, if overlap(previous end greater than interval.start), then keep updating temp end. till end < interval.start. Then add a new interval object to results.
Complexity:
Time: O(nlogn)
Space: O(n)
Code:
/**
* Definition for an interval.
* public class Interval {
* int start;
* int end;
* Interval() { start = 0; end = 0; }
* Interval(int s, int e) { start = s; end = e; }
* }
*/
public class Solution {
public List<Interval> merge(List<Interval> intervals) {
List<Interval> returnList = new ArrayList<Interval>();
if(intervals == null || intervals.size() == 0){
return returnList;
}
Comparator intervalComparator = new Comparator<Interval>(){
@Override
public int compare(Interval a, Interval b){
if(a.start == b.start){
return 0;
}
if(a.start < b.start){
return -1;
}
return 1;
}
};
Collections.sort(intervals, intervalComparator);
int start = intervals.get(0).start;
int end = intervals.get(0).end;
for(Interval itr : intervals){
if(end >= itr.start){
end = Math.max(end, itr.end);
}
else{
returnList.add(new Interval(start, end));
start = itr.start;
end = itr.end;
}
}
returnList.add(new Interval(start, end));
return returnList;
}
}