Medium
思路
- 区间进行排序, 以interval开始位置升序排列
- 循环整个interval的集合去查看有无交集,处理交集
- 合并交集:起点为前一个区间的起点,终点要比较两个区间较大的那个终点
- 因为不知道最后有多少个区间,所以先把结果放到arraylist里。最后再转为array
过程
Arrays.sort(intervals, (int[]a, int[]b) -> {
return a[0] - b[0];
});
- 用排序之后的集合里的第一个区间作为前置区间,去和其他区间比较
- 开始for循环,从i=1 开始, 当前interval为cur, 如果cur与prev有重合,将prev合并到cur中;如果没有重合,将prev加到结果中
- 每次循环后, 更新prev, prev = cur;
- for循环结束后,把最后一个prev加入到结果中
- 新建二维数组res,for循环将list中每个元素加进来
代码
class Solution {
public int[][] merge(int[][] intervals) {
if(intervals == null || intervals.length == 0) return new int[0][0];
List<int[]> list = new ArrayList<>();
Arrays.sort(intervals, (int[] a, int[] b) -> {
return a[0] - b[0];
});
int[] pre = intervals[0];
for(int i = 1; i < intervals.length; i++){
int[] cur = intervals[i];
if(pre[1] >= cur[0]){
cur[0] = pre[0];
cur[1] = Math.max(pre[1], cur[1]);
}else{
list.add(pre);
}
pre = cur;
}
list.add(pre);
int[][] res = new int[list.size()][2];
for(int i= 0; i < list.size(); i++){
res[i] = list.get(i);
}
return res;
}
}