给出一个区间的集合,请合并所有重叠的区间。
示例 1:
输入: intervals = [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入: intervals = [[1,4],[4,5]] 输出: [[1,5]] 解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
提示:
intervals[i][0] <= intervals[i][1]
首先使用冒泡排序对集合进行排序。当确定第I个最小初始端点的时候,判断它是否与第I-1个区间进行合并。
class Solution { public int[][] merge(int[][] intervals) { if(intervals==null) return null; boolean[] flags=new boolean[intervals.length]; int num=0; for(int i=0;i<intervals.length;i++) { //排序 for(int j=i+1;j<intervals.length;j++) { if(intervals[j][0]<intervals[i][0]) { //交换 int temp1=intervals[j][0]; int temp2=intervals[j][1]; intervals[j][0]=intervals[i][0]; intervals[j][1]=intervals[i][1]; intervals[i][0]=temp1; intervals[i][1]=temp2; } } if(i!=0) { if(intervals[i][0]>intervals[i-1][1]) {//两个区间 flags[i]=true; }else { intervals[i][0]=intervals[i-1][0];//合并成一个区间 intervals[i][1]=Math.max(intervals[i-1][1], intervals[i][1]); flags[i-1]=false; flags[i]=true; num--; } }else { flags[i]=true; } num++; } int[][] re=new int[num][2]; for(int i=0,j=0;i<flags.length;i++) { if(flags[i]) re[j++]=intervals[i]; } return re; } }看完官方题解之后,我对我的排序方法做了调整:
class Solution { public int[][] merge(int[][] intervals) { if(intervals==null) return null; boolean[] flags=new boolean[intervals.length]; int num=0; Arrays.sort(intervals,(a,b)->a[0]-b[0]); for(int i=0;i<intervals.length;i++) { if(i!=0) { if(intervals[i][0]>intervals[i-1][1]) {//两个区间 flags[i]=true; }else { intervals[i][0]=intervals[i-1][0];//合并成一个区间 intervals[i][1]=Math.max(intervals[i-1][1], intervals[i][1]); flags[i-1]=false; flags[i]=true; num--; } }else { flags[i]=true; } num++; } int[][] re=new int[num][2]; for(int i=0,j=0;i<flags.length;i++) { if(flags[i]) re[j++]=intervals[i]; } return re; } }java 排序时可使用Arrays.sort排序方法。Comparator接口返回值为正数时表示交换。负数表示不换。