合并区间
问题描述
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
样例输入
cpp
intervals = [[1,3],[2,6],[8,10],[15,18]]
样例输出
cpp
[[1,6],[8,10],[15,18]]
评测用例规模与约定
1 <= intervals.length <= 10^4
intervals[i].length == 2
0 <= starti <= endi <= 10^4
解析
按照区间左端点排序,然后比较在不在一个区间,在就合并,不在就加入。
为何按照左端点,右端点也行不过到倒着遍历,主要是有个顺序可以合并。
参考程序
cpp
class Solution {
public int[][] merge(int[][] intervals) {
if(intervals.length==0)return new int[0][2];
Arrays.sort(intervals,new Comparator<int[]>() {
public int compare(int[] interval1,int[] interval2){
return interval1[0]-interval2[0];
}
});
List<int[]>merged=new ArrayList<int[]>();
for(int i=0;i<intervals.length;i++){
int l=intervals[i][0],r=intervals[i][1];
if(merged.size()==0||merged.get(merged.size()-1)[1]<l)
merged.add(new int[]{l,r});
else merged.get(merged.size()-1)[1]=Math.max(merged.get(merged.size()-1)[1],r);
}
return merged.toArray(new int[merged.size()][]);
}
}
难度等级
⭐️⭐️⭐️⭐️(1~10星)
以个人刷题整理为目的,如若侵权,请联系删除~