区间合并
问题
给出一个区间的集合,请合并所有重叠的区间。
示例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] 可被视为重叠区间。
解题思路
由于给出的区间集合区间集合中存在交集的任意两个集合[a,b] [c,d]需要满足以下条件:
a < c 且 b > c
或
c < a 且 d > a
为了简化集合重叠问题,可以先基于集合的上界进行排序。集合重叠的条件简化为
c <= b
步骤如下
- 对数组进行排序
- 遍历排序后的集合,合并重叠集合
- 输出合并后的集合
代码实现
public static int[][] merge(int[][] intervals) {
// 对intervals的区间上界进行排序
Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
int left, right;
// 定义新的区间集合大小
int r = 0;
// 遍历排序后的集合,合并重叠集合
for (int i = 0; i < intervals.length; i++) {
left = intervals[i][0];
right = intervals[i][1];
// 查找区间下界
while (i < intervals.length - 1 && intervals[i + 1][0] <= right) {
i++;
right = Math.max(right, intervals[i][1]);
}
// 缓存结果数据
intervals[r][0] = left;
intervals[r++][1] = right;
}
// 生成合并后的集合
int[][] result = new int[r][2];
for (int i = 0; i < r; i++) {
result[i][0] = intervals[i][0];
result[i][1] = intervals[i][1];
}
return result;
}
完整代码上传至github
https://github.com/tinet-shenjg/leetCode4J
刷题大队
欢迎关注公众号【程序员Alex】回复:‘加群’加入刷题大队,一起刷题