题目描述
给出一个区间的集合,请合并所有重叠的区间。
示例 1:
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
解题思路
1、先对数组排序
2、相邻区间是否重叠,有重叠就合并,并新开一个数组去存储
没有重叠就将认为 是新的区间存储区间左端点或者上一个区间右端点
代码实现
class Solution {
public int[][] merge(int[][] intervals) {
if(intervals.length==0){
return intervals;
}
Arrays.sort(intervals, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[0]-o2[0];
}
});
int cnt = intervals.length;
int max=intervals[0][1];
int len = 0;
int[][] result = new int[cnt][2];
result[0][0]=intervals[0][0];
boolean flag = false;
boolean lv = false;
for(int i=1;i<intervals.length;i++){
if((!(intervals[i][0]>max)) ){
//说明有重叠区间
flag = true;
lv = true;
max =Math.max(max,intervals[i][1]);
result[len][1]=max;
}else {
if (!lv){
result[len][1]=intervals[i-1][1];
}else {
lv=false;
}
result[++len][0]=intervals[i][0];
max = intervals[i][1];
}
}
//处理最后一个数据
if (!lv){
result[len][1]=intervals[cnt-1][1];
}
if (flag){
int[][] res = new int[len+1][2];
for (int i = 0; i <len+1 ; i++) {
res[i][0]=result[i][0];
res[i][1]=result[i][1];
}
return res;
}
return intervals;
}
}