题目
方法一:排序
public class Merge {
public int[][] merge(int[][] intervals) {
//先根据各区间的左端点升序排序,在逐个判断是否覆盖,覆盖则合并区间。
if (intervals.length == 0) {
return new int[0][2];
}
//排序
Arrays.sort(intervals, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[0] - o2[0];
}
});
ArrayList<int[]> list = new ArrayList<>();
for (int i = 0; i < intervals.length; i++) {
int l = intervals[i][0], r = intervals[i][1];
if (list.size()==0 || list.get(list.size()-1)[1]<l) { //区间不覆盖则不合并,放到结果集内,下个循环以这个作为校验基础
list.add(new int[]{l, r});
} else {
list.get(list.size()-1)[1] = Math.max(r, list.get(list.size()-1)[1]); //比较最大的右端点
}
}
return list.toArray(new int[list.size()][2]);
}
public static void main(String[] args) {
Merge merge = new Merge();
int intervals[][] = {{1,3},{2,6},{8,10},{15,18}};
System.out.println(Arrays.deepToString(merge.merge(intervals)));
}
}
LeetCode测试结果