56. 合并区间
思路
-
排序:首先按照每个区间的起始位置
start升序排列。这样可以保证我们按顺序处理区间,便于判断是否重叠。 -
遍历合并:
-
维护一个结果列表
result。 -
将第一个区间加入结果列表。
-
对于后续每一个区间:
- 如果当前区间的
start大于结果列表中最后一个区间的end,说明不重叠,直接加入。 - 否则说明重叠,则将结果列表中最后一个区间的
end更新为两者end的最大值(即合并)。
- 如果当前区间的
-
复杂度分析
-
时间复杂度:
O(n log n)- 排序:
O(n log n),其中n是区间个数。 - 遍历合并:
O(n)。 - 总体时间复杂度由排序主导。
- 排序:
-
空间复杂度:
O(n)-
n为不重叠的区间个数
-
代码
class Solution {
public int[][] merge(int[][] intervals) {
// 排序
Arrays.sort(intervals, (a, b) -> (a[0] - b[0]));
// 结果
LinkedList<int[]> res = new LinkedList<>();
// 将第一个区间添加进结果
res.add(intervals[0]);
// 从第二个开始遍历
for (int i = 1; i < intervals.length; i++) {
int[] curr = intervals[i];
int[] last = res.getLast();
if (curr[0] > last[1]) {
// 如果当前区间最小值大于结果最后区间的最大值,直接加入
res.add(curr);
} else {
// 否则,结果最后区间更新最大值
last[1] = Math.max(last[1], curr[1]);
}
}
return res.toArray(new int[0][0]);
}
}

浙公网安备 33010602011771号