合并区间
题目描述:
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
思路:
合并区间主要是比较边界,两个区间之间要么是完全没有重合,要么是有重叠部分,要么是一个被另一个完全覆盖,针对这三种情况后两种需要合并区间,若直接两两进行比较,成本巨大,所以想到排序(以int[] [0]升序排列),这样遍历整个二维数组合并该合并的区间即可。采用双指针,分别记录当前左边界与右边界,若当前右指针小于下一个区间的左边界,说明当前(l,r)的区间可以加入到res中,若右指针大于下一个区间的左边界说明右指针需要更新。
代码中做出的三处注释是后来参考题解做出的一些小的优化
代码:
public static int[][] merge(int[][] intervals) {
// Arrays.sort(intervals, new Comparator<int[]>() {
// @Override
// public int compare(int[] o1, int[] o2) {
// return o1[0]-o2[0];
// }
// });
Arrays.sort(intervals,(x,y)->(x[0]-y[0]));
List<int[]> res =new ArrayList<>();
int l = intervals[0][0];
int r = intervals[0][1];
for (int i = 0; i < intervals.length; i++) {
if(i==intervals.length-1){
// int[] tmpres = {l,r};
// res.add(tmpres);
res.add(new int[]{l,r});
break;
}
if(r<intervals[i+1][0]){
// int[] tmpres = {l,r};
// res.add(tmpres);
res.add(new int[]{l,r});
l = intervals[i+1][0];
r = intervals[i+1][1];
}else if(r<=intervals[i+1][1]&&r>=intervals[i+1][0]){
r = intervals[i+1][1];
}
}
int[][] cur = new int[res.size()][2];
return res.toArray(cur);
// for (int i = 0; i < res.size(); i++) {
// cur[i] = res.get(i);
// }
// return cur;
}