解题思路:
一次遍历,首先按照每个元素区间的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中选择一个最大的作为合并区间的endres.get(res.size()-1)[1]=Math.max(res.get(res.size() - 1)[1], e);}}return res.toArray(new int[res.size()][]);}