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:
1. Sorting each intervals in ascending order. We can either define a class which implements Comparator interface or define a anonymous class.
2. Merging. Note that there will be lots of cases. We only add the merged interval into the result list when a.end<b.start. Remember to add interval a in the end.
/**
* 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 {
/*
class IntervalComparator implements Comparator<Interval> {
public int compare(Interval a, Interval b) {
return a.start - b.start; // ASC order
}
}
*/
public ArrayList<Interval> merge(ArrayList<Interval> intervals) {
if(intervals.size()<=1) return intervals;
ArrayList<Interval> res = new ArrayList<Interval>();
Collections.sort(intervals, new Comparator<Interval>(){ // sorting based on the first element
public int compare(Interval a, Interval b) {
return a.start-b.start; // ascending order
}
});
Interval a = intervals.get(0);
for(int i=1; i<=intervals.size()-1; i++) {
Interval b = intervals.get(i);
if(a.end < b.start) { // cannot be merged
res.add(a);
a = b;
}
else if(a.end == b.start) {
a.end = b.end;
}
else if(a.end > b.start) {
if(a.end<b.end) a.end=b.end;
else continue;
}
}
res.add(a);
return res;
}
}