一、题目
给出一组区间,请合并所有重叠的区间。
请保证合并后的区间按区间起点升序排列
二、实现
对左边界排序,如果下一个区间的左边界在前一个的有边界内,考虑是否要更新边界,
如果如果下一个区间的左边界在前一个的有边界外,说明区间无法合并,开始计算下一个区间
首先我们来考虑一个问题:什么样的两个区间可以合并?
像上图这样,起点大的那个区间([13,16])的起点在另一个区间的范围之内,这样两个区间就可以进行合并了
所以我们把全部的区间按起点进行排序,然后看一下第i个区间能不能和i-1个区间合并,如果能合并的话,就删掉第i-1个区间,然后把第i个区间变成这两个区间的合并
/**
* 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; }
* }
*/
import java.util.*;
public class Solution {
public ArrayList<Interval> merge(ArrayList<Interval> intervals) {
ArrayList<Interval> res = new ArrayList<>(); //结果集
//1. 首先对每个区间的起点进行排序(递增)
Collections.sort(intervals, (a,b)-> a.start-b.start);
int len = intervals.size();
if(len == 0) return res;
//2. 遍历每一个区间。遍历过程中合并所有重合的区间
for(int i=0;i<len;i++){
int start = intervals.get(i).start;
int end = intervals.get(i).end;
// 将所有重叠的区间合并(即下一区间的开始点,在上一区间内)
while(i<len-1 && intervals.get(i+1).start <= end){
// 更新开始和结束点
start = Math.min(start,intervals.get(i+1).start); //开始取最小
end = Math.max(end,intervals.get(i+1).end);//结束取最大
i++; //继续遍历下一个区间是否重叠
}
res.add(new Interval(start,end)); //将合并后的区间加入结果集
}
return res;
}
}