解题思路:
一次遍历,首先按照每个元素区间的start来排序,之后定义一个列表将第一个元素添加进去,依次遍历数组的每个元素,如果第二个元素区间的start小于或者等于第一个元素区间的end,则证明两个区间是重叠的,需要进行合并区间操作,在合并的时候取第一个区间的start元素为新区间的start,取两个区间最大的end,为新区间的end,最后将新区间添加到列表中。如果二个元素区间的start大于第一个元素区间的end,则两个区间是不重叠的,直接将第二个区间添加到列表中,最后将列表转换为数组返回。
代码实现:
public int[][] merge(int[][] intervals) {
//首先对二维数组按照第一个元素进行排序
Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
//定义列表用于返回结果
List<int[]> res = new ArrayList<>();
res.add(intervals[0]);
for(int i=1;i<intervals.length;i++)
{
int s = intervals[i][0], e = intervals[i][1];
if(res.get(res.size() - 1)[1]<s)//第二个区间的start大于第一个区间的end,证明不重叠
{
//将第二个区间添加进去
res.add(intervals[i]);
}
else
{
//两个区间重叠了,则执行合并操作
//从两个区间的end中选择一个最大的作为合并区间的end
res.get(res.size()-1)[1]=Math.max(res.get(res.size() - 1)[1], e);
}
}
return res.toArray(new int[res.size()][]);
}