56.合并区间
难度:中等
标签:数组,排序
给出一个区间的集合,请合并所有重叠的区间。
示例 1:
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
class cmp implements Comparator{
@Override
public int compare(Object o1, Object o2) {
int[] a= (int[]) o1;
int[] b=(int[]) o2;
return a[0]-b[0];
}
}
public int[][] merge(int[][] intervals) {
if(intervals==null||intervals.length==0||intervals.length==1)
return intervals;
//二维数组按照,每个数组的第一个数排序
Arrays.sort(intervals,new cmp());
//由于不知道合并后的长度,使用Arraydeque存储结果
ArrayDeque<int[]> res=new ArrayDeque<>();
res.addLast(intervals[0]);
int[] a=null;
for(int i=1;i<intervals.length;i++){
//上一个数组和下一个数组比较,是否有重合
a=res.removeLast();
if(a[1]>=intervals[i][0]){
//有重合就合并,如果有多个连续的可以合并的区间,可以一起合并
while(a[1]>=intervals[i][0]){
a[1]=Math.max(intervals[i][1],a[1]);
i++;
}
i--;
res.addLast(a);
/* a[1]=Math.max(a[1],intervals[i][1]);
//添加到结果中
res.addLast(a);*/
}
else {
//如果没有重合,两个数组都添加到结果中
res.addLast(a);
res.addLast(intervals[i]);
}
}
//将arrayDeque转换为二维数组
int[][] res1=new int[res.size()][];
for(int i=0;!res.isEmpty();i++){
res1[i]=res.removeFirst();
}
return res1;
}