要求:
给出一个区间的集合,请合并所有重叠的区间。
示例:
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6]
输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
思路:
- 前期准备工作:
- 输入是二维数组,先对二维数组排序,排序的依据是每个数组的左边界值的大小关系。
Arrays.sort(数组名,new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[0] - o2[0];
}
});
- 对数组合并进行情况的划分,假设是o1[左,右],o2[左,右]两个
- o1[右]<o2[左],无法合并,直接添加o2[];
- o1[右]>=o2[左],合并,更新数组的右边界。
- 需要注意的事情:
-
需要先对特殊情况做判断
-
创建一个元素内容为int[]的List用于添加元素,res
-
先将第一个数组添加进来
-
开始循环:
- 用一个临时数组存储当前获取的元素
- 用一个临时数组获取当前res中的最后一个元素
- 进行比较和合并
-
最后将res转换成一个数组,将res中的内容作为元素输入到新的数组中。
代码:
class Solution {
public int[][] merge(int[][] intervals) {
int len = intervals.length;
if(len<2) return intervals;
Arrays.sort(intervals, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[0] - o2[0];
}
});
List<int[]> res = new ArrayList<>();
res.add(intervals[0]);
for (int i = 1; i<len; i++) {
int[] temp = intervals[i];
int[] peek = res.get(res.size()-1);
if (peek[1] < temp[0]) {
res.add(temp);
} else {
peek[1] = Math.max(peek[1], temp[1]);
}
}
return res.toArray(new int[res.size()][]);
}
}