给出一个区间的集合,请合并所有重叠的区间。
示例 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] 可被视为重叠区间。
题解思路
先对二维数组按区间左端点大小排序,然后依次入栈
若栈内区间右端点小于当前区间左端点,则两个区间无重叠部分,直接将当前区间入栈
若栈内区间右端点大于当前区间左端点,则说明两区间存在重叠部分,更新栈内区间右端点值,取最大
实现代码
class Solution {
public int[][] merge(int[][] intervals) {
if(intervals.length == 0){
return new int[0][2];
}
Arrays.sort(intervals, new Comparator<int[]>(){
public int compare(int[] o1, int[] o2){
return o1[0] - o2[0];
}
});
Deque<int[]> stack = new LinkedList<>();
for(int[] i : intervals){
int[] j = stack.peek();
if(stack.isEmpty() || j[1] < i[0]) {
stack.push(i);
}else {
j[1] = Math.max(j[1], i[1]);
}
}
int[][] res = new int[stack.size()][2];
for(int i = stack.size() - 1; i >= 0; i--) {
res[i] = stack.pop();
}
return res;
}
}