原题链接
思路:先对该二维数组把最小的start放在最前面,由于可合并区间都是交错的,也就是说当前一个的end总会大于后一个的start,循环遍历就完事了。
public int[][] merge(int[][] intervals) {
int n = intervals.length;
if(n <= 1)return intervals;
int flag = 0;
Map<Integer,Integer> map = new HashMap<>();
Arrays.sort(intervals, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[0]-o2[0];
}
});
for (int i = 0; i < n-1; i++) {
flag = 0;
if (intervals[i][1]>=intervals[i+1][0]){
intervals[i+1][0] = Math.min(intervals[i][0],intervals[i+1][0]);
intervals[i+1][1] = Math.max(intervals[i][1],intervals[i+1][1]);
flag=1;
}
if (flag==0){
map.put(intervals[i][0],intervals[i][1]);
}
}
flag=0;
map.put(intervals[n-1][0],intervals[n-1][1]);
int res[][] = new int[map.size()][2];
for (Integer a :map.keySet()) {
res[flag][0]=a;
res[flag++][1]=map.get(a);
}
return res;
}