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].
/** * 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; } * } */ 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) { if (intervals == null || intervals.size() <= 1) { return intervals; } // sort intervals by using self-defined Comparator Collections.sort(intervals, new IntervalComparator()); List<Interval> result = new ArrayList<Interval>(); Interval prev = intervals.get(0); for (int i = 1; i < intervals.size(); i++) { Interval curr = intervals.get(i); if (hasIntersection(prev, curr)) { // merged case Interval merged = merge(prev, curr); prev = merged; } else { result.add(prev); prev = curr; } } result.add(prev); return result; } public Interval merge(Interval a, Interval b) { return new Interval(Math.min(a.start, b.start), Math.max(a.end, b.end)); } public boolean hasIntersection(Interval a, Interval b) { //a.end intersects with [b.start, b.end] or vice versa return (a.end >= b.start && a.end <= b.end) || (b.end >= a.start && b.end <= a.end); } } class IntervalComparator implements Comparator<Interval> { public int compare(Interval i1, Interval i2) { return i1.start - i2.start; } }
No comments:
Post a Comment