题干
给出一个区间的集合,请合并所有重叠的区间。
示例 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] 可被视为重叠区间。
想法
先按照每个区间的左端点排序
然后再遍历判断右端点包含更大那个
注意注意注意边界条件
Java代码
package daily;
import java.util.*;
import java.util.Comparator;
public class MergingInterval {
public int[][] merge(int[][] intervals) {
List<int[]> res=new ArrayList<>();
//空判断
if (intervals.length == 0 || intervals == null) return res.toArray(new int[0][]);
//按照左端点升序排序
Arrays.sort(intervals, Comparator.comparingInt(a -> a[0]));
for(int i=0;i<intervals.length;i++){
//左右端点
int left=intervals[i][0];
int right=intervals[i][1];
//合并区间 right取大的
while(i<intervals.length-1&&intervals[i+1][0]<=right){
i++;
right=Math.max(right,intervals[i][1]);
}
res.add(new int []{left,right});
}
return res.toArray(new int[0][]);
}
public static void main(String[] args){
MergingInterval mergingInterval=new MergingInterval();
int [][] test=new int [][]{{1,3},{2,6},{8,10},{15,18}};
int [][]result=mergingInterval.merge(test);
for (int [] ints: result
) {
System.out.println(Arrays.toString(ints));
}
}
}