题目描述:
给出一个区间的集合,请合并所有重叠的区间。
示例 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] 可被视为重叠区间。
代码:
class Solution {
public int[][] merge(int[][] intervals) {
if(intervals.length == 0){
return intervals;
}
PriorityQueue<int[]> tempri = new PriorityQueue<>(
(a,b)->(a[0] - b[0])
);
for (int[] is : intervals) {
tempri.offer(is);
}
Stack<int[]> temStack = new Stack<>();
temStack.push(tempri.peek());
while (!tempri.isEmpty()) {
int tem[] = tempri.poll();
int stack[] = temStack.pop();
if(tem[0] >= stack[0] && tem[1] <= stack[1]){
temStack.push(stack);
continue;
}
if (tem[0] <= stack[1] && stack[1] <= tem[1]) {
stack[1] = tem[1];
temStack.push(new int[]{stack[0],stack[1]});
}else {
temStack.push(new int[]{stack[0],stack[1]});
temStack.push(new int[]{tem[0],tem[1]});
}
}
int[][]result = new int[temStack.size()][2];
int index = 0;
for (int[] is : temStack) {
result[index][0] = is[0];
result[index++][1] = is[1];
}
return result;
}
}
排名靠前的代码
class Solution {
public int[][] merge(int[][] intervals) {
int rows = intervals.length;
if (rows == 0) {
return intervals;
}
int count = rows;
for (int i = 0; i < rows - 1; i++) {
for (int j = i + 1; j < rows; j++) {
if (canMerge(intervals, i, j)) {
count--;
break;
}
}
}
int[][] res = new int[count][2];
int index = 0;
for (int[] row : intervals) {
if (row != null) {
res[index++] = row;
}
}
return res;
}
public boolean canMerge(int[][] intervals, int first, int second) {
if (!((intervals[first][0] < intervals[second][0] && intervals[first][1] < intervals[second][0])
|| (intervals[second][0] < intervals[first][0] && intervals[second][1] < intervals[first][0]))) {
intervals[second] = new int[] { Math.min(intervals[first][0], intervals[second][0]),
Math.max(intervals[first][1], intervals[second][1]) };
intervals[first] = null;
return true;
}
return false;
}
}