持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情
以数组 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 <= 104intervals[i].length == 20 <= starti <= endi <= 104
解题思路:(排序一)
如果我们都拿区间的左端点进行排序,排序后的数组中,区间一定是连续的
上面的话可以用反证法来证明:在排序后的数组中,两个本应合并的数组并没有发生合并,那么就说明存在这样的数组[i,j,k]以及它们的区间A[i],A[j],A[k],满足i<j<k,并且A[i]和A[k]可以合并,但(A[i],A[j])和(A[j],A[k])并不能合并,说明他们满足下列不等式:
A[i].end < A[j].start(A[i]和A[j]不能合并)A[j].end < A[k].start(A[j]和A[k]不能合并)A[j].start <= A[j].endA[i].end >= A[k].start(A[i]和C[i]可以合并)通过上述这四个不等式,我们可以得到:A[i].end < A[j].start <= A[j].end < A[k].start通过上面的列的不等式可以看出,存在矛盾,假设不成立,因此,所有能够合并的区间一定是连续的
代码:(JAVA实现)
public static int[][] mind(int[][] nums) {
if (nums.length == 0) {
return new int[0][2];
}
//按照区间起始位置来排序
Arrays.sort(nums,(v1,v2) -> v1[0] - v2[0]);
ArrayList<int[]> merga = new ArrayList<int[]>();
for (int i = 0; i < nums.length;i++) {
//L就是当前区间的左端点
int L = nums[i][0];
//R就是当前区间的右端点
int R = nums[i][1];
//如果数组merga的长度为0,或当前区间的左端点在数组merga的最后一个区间的右端点之后,那么它们不会重合,我们可以直接将这个区间添加到数组merga的末尾
//否则,它们重合,我们需要拿当前区间的右端点更新数组merga的最后一个区间的右端点,取两个数字的最大值
if (merga.size() == 0 || merga.get(merga.size() - 1)[1] < L) {
merga.add(new int[]{L,R});
}else {
merga.get(merga.size() - 1)[1] = Math.max(R,merga.get(merga.size() - 1)[1]);
}
}
return merga.toArray(new int[merga.size()][]);
}
复杂度分析:
- 时间复杂度:
O(n logn),n为区间的数量,(logn)为排序的时间复杂度 - 空间复杂度:
O(logn),(logn)为排序所需要的空间复杂度
提交结果
解题思路:(排序二)
第二种方法其实从思路上来想跟第一种一样,都是合并两个数组,这里就不再讲一遍了,直接看代码
代码:(JAVA实现)
public static int[][] mind(int[][] nums) {
//先按照区间起始位置来排序
Arrays.sort(nums,(v1,v2) -> v1[0] - v2[0]);
//遍历区间
int[][] res = new int[nums.length][2];
int index = -1;
for (int[] i : nums) {
//如果数组是空的,或者当前区间的起始位置 > 结果数组中最后区间的终止位置
//则不合并,将当前区间放进结果数组里
if (index == -1 || i[0] > res[index][1]) {
res[++index] = i;
}else {
// 反之将当前区间合并至结果数组的最后区间
res[index][1] = Math.max(res[index][1], i[1]);
}
}
return Arrays.copyOf(res,index + 1);
}
复杂度分析:
- 时间复杂度:
O(n logn),n为区间的数量,(logn)为排序的时间复杂度 - 空间复杂度:
O(logn),(logn)为排序所需要的空间复杂度