leecode算法《56. 合并区间》详解有注释,简单明了。
原题内容
给出一个区间的集合,请合并所有重叠的区间。
示例 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] 可被视为重叠区间。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-intervals
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法一:贪婪算法(排序)
首先,我们将列表按上述方式排序。然后,我们将第一个区间插入 merged 数组中,然后按顺序考虑之后的每个区间:如果当前区间的左端点在前一个区间的右端点之后,那么他们不会重合,我们可以直接将这个区间插入 merged 中;否则,他们重合,我们用当前区间的右端点更新前一个区间的右端点 end 如果前者数值比后者大的话。
代码
public static int[][] merge(int[][] intervals) {
// 对所有的区间按照起始顺序进行排序
Arrays.sort(intervals, Comparator.comparingInt(o -> o[0]));
// 定义一个pre变量 初始值为null
int[] pre = null;
// result 用来存放结果
List<int[]> result = new ArrayList<>();
// 从头开始遍历所有的区间
for (int[] num : intervals) {
// 如果这是第一个区间,或者当前区间和上一个区间没有重叠,那么将当前区间加入到结果中
if (pre == null || pre[1] < num[0]) {
result.add(pre = num);
} else {
// 否则两个区间发生了重叠,更新第一个区间的结束值
pre[1] = Math.max(pre[1], num[1]);
}
}
// 返回结果
return result.toArray(new int[result.size()][]);
}