Sunday, February 9, 2014

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].

Solution:
Same logic as insert intervals, but we need to sort the intervals first.

/**
 * 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 ArrayList merge(ArrayList intervals) {
        ArrayList ret = new ArrayList();
        if(intervals.size() == 0) return ret;
        Collections.sort(intervals, new myComparator()); // use Comparator to compare non-primitive data types
        Interval tmp = intervals.get(0);
        for(int i = 1; i < intervals.size(); i++){
            Interval cur = intervals.get(i);
            if(cur.end < tmp.start){
                ret.add(cur);
            }
            else if (cur.start > tmp.end){
                ret.add(tmp);
                tmp = cur;
            }
            else{
                int start = Math.min(cur.start, tmp.start);
                int end = Math.max(cur.end, tmp.end);
                tmp = new Interval(start, end);
            }
        }
        ret.add(tmp);
        return ret;
    }
}

class myComparator implements Comparator{
    public int compare(Interval a, Interval b){
        return a.start - b.start;
    }
}

No comments:

Post a Comment