56. 合并区间
给出一个区间的集合,请合并所有重叠的区间。
示例 1:
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
通过次数
71,934
提交次数
174,436
题解:
根据题目分析可知,如果我们按照区间的左端点排序,那么在排完序的列表中,可以合并的区间一定是连续的。我们将排好序的数组进行循环遍历,区间重合的进行合并,并用一个集合存放。
算法:
排好序的数组,对其进行合并区间判断
while i < n
left = intervals[i][0]
right = intervals[i][1]
//此处判断第i数组的右边界是否大于第i+1数组的左边界
while i < n-1 || right >= intervals[i+1][0]
//进行合并
right = Math.max(right,intervals[i+1][1])
i++
a = {left,right}
//将合并的数组放入ArrayList集合中
list.add(a)
i++
//集合转数组
return list.toArray(new int[list.size()][2])
java代码:
class Solution {
public int[][] merge(int[][] intervals) {
//判空
if(intervals==null||intervals.length<=1)
return intervals;
//定义集合接收合并数组
List<int[]> list=new ArrayList<>();
//对数组排序,这里用了lamda表达式
Arrays.sort(intervals,(x,y)->x[0]-y[0]);
int i = 0, n = intervals.length;
while(i<n){
int l = intervals[i][0];
int r = intervals[i][1];
while(i<n-1&&r>=intervals[i+1][0]){
r = Math.max(r,intervals[i+1][1]);
i++;
}
int[] a={l,r};
list.add(a);
i++;
}
//集合转数组
return list.toArray(new int[list.size()][2]);
}
}
程序运行效率:
此程序效率并不算高,若想查看更多优质代码,请查看力扣官方题解。