问题描述:
Given a collection ofintervals, merge all overlapping intervals.
For example,
Given [1,3],[2,6],[8,10],[15,18]
,
return [1,6],[8,10],[15,18]
.
Subscribe to see which companies asked thisquestion
问题分析:
常见的合并区间问题,如果所有区间都是乱序排序列的话,需要记录的数据量之大可想而知;故这里采用首先对所有Intervals根据其start的位置,进行一次排序。排序的时间复杂度为O(nlgn);
排序之后所有Intervals的start都是顺序的,下面可以对其进行遍历;比较有两种情况:
1) Interval的start在当前区间之内,即interval.start <=this_interval.end;则可以将当前的interval与前一个区间连接到一起。只需要更新end值即可;
2) 如果interval.start > this_interval.end,则表示中间发生了断层,不能和前一个区间连接到一起,则将前一个区间添加在结果列表中。然后更新新的考察区间值start与end为interval的区间值。
代码:
/** * 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) { if (intervals.size() <= 1) return intervals; // 先根据Interval类的start首位置进行排序 Collections.sort(intervals, new Comparator<Interval>() { @Override public int compare(Interval i1, Interval i2) { return Integer.compare(i1.start, i2.start); } }); List<Interval> result = new LinkedList<Interval>(); int start = intervals.get(0).start; int end = intervals.get(0).end; // 遍历所有Interval for (Interval interval : intervals) { if (interval.start <= end) // 如果start值在前一个区间范围内,则更新end值即可 end = Math.max(end, interval.end); else { // 如果start值不在前一个区间范围内,由于之前已经按照start顺序排列过,因此表示中间发生了断层 result.add(new Interval(start, end)); // 将前一区间值保存至结果 start = interval.start; // 更新新的区间的范围值 end = interval.end; } } // 注意将最后一个区间添加到结果列表中 result.add(new Interval(start, end)); return result; } }