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; } }