一、题目介绍
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。
示例 1:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。
二、算法思想
为了方便遍历以及比较,于是对整个二维数组中的左边元素进行排序,如下图所示。
我们用path的List集合作为一个中间站,用来暂时存储合并后的数组或者不用合并的数组。
按照升序排序之后,我们就开始遍历,如果第二个数组的左端点元素小于等于第一个数组的右端点元素,那么说明两个数组的元素有交叉,于是就将这两个数组的右端点设置为第一个数组和第二个数组中右端点最大的那个值,然后将合并后的数组加入list集合中。否则就将不用合并的数组加入到path中,之后再接着向后遍历。
三、代码实现
class Solution {
public int[][] merge(int[][] intervals) {
//此处需要注意,这里是重写了compare方法,用来告诉sort函数是按照升序还是降序来进行排序。
Arrays.sort(intervals,new Comparator<>()
{
public int compare(int a[],int b[])
{
return a[0]-b[0];
}
});
List<int[]> path=new ArrayList<>();
int i=0;
while(i<intervals.length)
{
int leftBound=intervals[i][0];
int rightBound=intervals[i][1];
while(i<intervals.length-1 && intervals[i+1][0]<=rightBound)
{
i++;
rightBound=Math.max(intervals[i][1],rightBound);
}
path.add(new int[]{leftBound,rightBound});
i++;
}
return path.toArray(new int[0][]);
}
}