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

题目中给定了一个interval集合,要求我们将集合中的interval合并,合并之后的interval是按照升序排列的。我们可以先将interval排序先按照interval的第一个元素,如果第一个元素相等就按照第二个元素。排序的时候我们定义一个比较器comparator。排序之后,从第二个interval开始,如果第二个interval的第一个元素等于或小于第一个interval的第二个元素,那么就将intervals[1].end = Math.max(intervals[2].end, intervals[1].end)。如果没有重叠,直接打入到结果集中。时间复杂度为O(nlogn)。代码如下:
/**
 * 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> list = new ArrayList<Interval>();
        if(intervals == null || intervals.size() == 0) return list;
        Collections.sort(intervals, new Comparator<Interval>() {
            @Override
            public int compare(Interval i1, Interval i2) {
                if(i1.start == i2.start) 
                    return i1.end - i2.end;
                return i1.start - i2.start;
            }
        });
        list.add(intervals.get(0));
        for(int i = 0; i < intervals.size(); i++) {
            if(list.get(list.size() - 1).end >= intervals.get(i).start) {
                list.get(list.size() - 1).end = Math.max(list.get(list.size() - 1).end, intervals.get(i).end);
            } else {
                list.add(intervals.get(i));
            }
        }
        return list;
    }
}

猜你喜欢

转载自kickcode.iteye.com/blog/2280992