题目描述:
以数组
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] 可被视为重叠区间。提示:
1 <= intervals.length <= 10^4
intervals[i].length == 2
0 <= starti <= endi <= 10^4
贪心思路:
- 对输入的二维数组
intervals
按照区间的起始进行排序。初始化两个变量left
和right
,分别代表当前合并区间的左右边界。 - 定义一个
List<int[]>
类型的ans
列表,用来存储最终合并后的区间。 - 从第二个区间开始遍历
intervals
数组:- 如果当前区间的起始
intervals[i][0]
小于等于当前合并区间的结束right
,说明当前区间可以合并到当前合并区间中。此时更新right
为当前合并区间的结束时间和当前区间结束的最大值。 - 如果当前区间的起始
intervals[i][0]
大于当前合并区间的结束right
,说明当前区间无法合并到当前合并区间中。此时将当前合并区间添加到ans
列表中,并更新left
和right
为当前区间的起始和结束。
- 如果当前区间的起始
- 在遍历完所有区间之后,将最后一个合并区间添加到
ans
列表中。
时间复杂度为 O(n log n),主要由排序操作造成。空间复杂度为 O(n),因为需要存储最终合并后的区间。这个算法使用贪心的方法,在遍历过程中不断合并重叠的区间,最终得到合并后的区间集合。
class Solution {
public int[][] merge(int[][] intervals) {
Arrays.sort(intervals, Comparator.comparingInt(a -> a[0]));
int left = intervals[0][0];
int right = intervals[0][1];
int i = 1;
List<int[]> ans = new ArrayList<>();
while (i < intervals.length) {
if (right >= intervals[i][0]) {
right = Math.max(right, intervals[i][1]);
} else {
//ans.add
ans.add(new int[]{left,right});
left = intervals[i][0];
right = intervals[i][1];
}
i++;
}
ans.add(new int[]{left,right});
return ans.toArray(new int[ans.size()][]);
}
}