跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的!
代码随想录
LeetCode:56.合并区间以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
示例 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] 可被视为重叠区间。
- 类似前面的弓箭射气球问题,这里需要注意左边界是
res
里面最后一个元素的左边界 - 重叠的时候需要删除
res
里面上一个元素,再重新插入新元素
java
public int[][] merge(int[][] intervals) {
Arrays.sort(intervals, (o1, o2) -> Integer.compare(o1[0], o2[0]));
LinkedList<int[]> res = new LinkedList<>();
res.add(intervals[0]);
for (int i = 1; i < intervals.length; i++) {
if (intervals[i][0] <= intervals[i - 1][1]) {
intervals[i][1] = Math.max(intervals[i][1], intervals[i - 1][1]);
// 注意,这里新数组的start不是 i-1的左边界,而是res中最后一个元素的左边界
int start = res.getLast()[0];
int end = intervals[i][1];
// 注意这里需要移除res中最后一个的元素 然后才能插入新元素
res.removeLast();
res.add(new int[] { start, end });
} else {
res.add(intervals[i]);
}
}
return res.toArray(new int[res.size()][]);
}