解题思路:
首先将二维数组进行排序,按照每个区间的第一个数字排序,再新建一个List<int[]> res用于存放结果集。先把排序好的第一个区间加入res中,intervals从第二个区间开始遍历,依次判断intervals对应的首位值和res中的最后一个区间的末位值,如果首位值比末位值大,将此次intervals的区间加入res中,否则将res最后一个区间的末位值更新为intervals区间的末位值和res最后一个区间的末位值中的最大值,直到最后。
代码
class Solution {
public int[][] merge(int[][] intervals) {
if(intervals==null || intervals.length==0) {
return intervals;
}
Arrays.sort(intervals, (x,y)->x[0]-y[0] ); //按照每个区间的第一个数排序,通过静态Arrays类排序,使用comparator
List<int[]> arr = new ArrayList<int[]>();
arr.add(intervals[0]);
for(int i=1;i<intervals.length;++i) {
//[x1,x2]和[y1,y2]比较,如果x2<y1说明这两个区间不相交
if(arr.get(arr.size()-1)[1] < intervals[i][0]) {
arr.add(intervals[i]);
}
//否则,将这两个区间合并为 [x1,max(x2,y2)]
else {
arr.get(arr.size()-1)[1] = Math.max(arr.get(arr.size()-1)[1],intervals[i][1]);
}
}
return arr.toArray(new int[arr.size()][2]); //转换类型返回
}
}
复杂度
时间复杂度:O(NlogN),由于sort()排序为O(NlogN),后面遍历一次为O(N),综合为O(NlogN)
空间复杂度:O(N)