题目
给出一个区间的集合,请合并所有重叠的区间。
思路
- 将数组按照起始区间排序:
Arrays.sort(intervals,(o1, o2)->o1[0]-o2[0]);
- while循环找到重叠的区间,使用list进行存储。
代码
class Solution {
public int[][] merge(int[][] intervals) {
//将集合起始的位置从小到大排列
int len = intervals.length;
if(intervals==null||len==0){return new int[0][2];}
Arrays.sort(intervals,(o1, o2)->o1[0]-o2[0]);//从小到大排列
List<int[]> list = new ArrayList<>();
int i=0;
while(i<len){
int left = intervals[i][0];
int right = intervals[i][1];
while(i+1<len&&right>=intervals[i+1][0]){
i++;
right = Math.max(right, intervals[i][1]);
}
list.add(new int[]{left,right});
i++;
}
return list.toArray(new int[0][]);
}
}
算法复杂度
- 时间复杂度:
O(nlogn)
,主要是排序的时间复杂度。 - 空间复杂度:
O(logn)
,排序的空间复杂度。