给出一个区间的集合,请合并所有重叠的区间。
示例 1:
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
解题思路:按照区间起始位置从小到大位置排序(若起始位置同等,则按照结束位置从小到大排序),变量left和right,记录当前区间前一个区间的起始位置和结束位置
处理当前区间时,有两种情况:
- 当前区间的起始位置在left和right之间(left >= intervals.get(i).start && left <= intervals.get(i).end)(当前区间与前一区间有重叠可合并),则更新区间右端点为right和当前区间结束位置的最大值:right = Math.max(right, intervals.get(i).end)
- 否则,当前区间与前一区间无重叠不可合并,则将[left, right]放入结果集中,并更新left和right为当前区间的起始位置和结束位置
java代码:
/**
* 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 Solution {
public List<Interval> merge(List<Interval> intervals) {
if(intervals.isEmpty())
return new ArrayList<Interval>();
//区间按照区间起始位置排序
Collections.sort(intervals, new Comparator<Interval>() {
public int compare(Interval o1, Interval o2) {
return o1.start < o2.start ? -1 : (o1.start > o2.start ? 1 :
(o1.end < o2.end ? -1 : (o1.end > o2.end ? 1 : 0)));
}
});
List<Interval> res = new LinkedList<Interval>();
int left = intervals.get(0).start, right = intervals.get(0).end;
for(int i = 0; i < intervals.size(); i++) {
if(intervals.get(i).start >= left && intervals.get(i).start <= right) {
right = Math.max(right, intervals.get(i).end);
} else {
res.add(new Interval(left, right));
left = intervals.get(i).start;
right = intervals.get(i).end;
}
}
res.add(new Interval(left, right));
return res;
}
}