题目如下:
以数组 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 <= 104
intervals[i].length == 2
0 <= starti <= endi <= 104
解题思想:
本题的主要思想就是合并有交集范围的数组,形成一个大的新数组,加入到list中去。解题思路直接先排序给定的数据,如果list为空,说明list处于初始阶段,那么遍历数组的某一个元素,直接加入到lits中去;如果数组不为空,那么判断list最后一个元素的最大值,和遍历数据的起始值(代码中k1)比较,遍历数据的起始值大,则说明不在list最后一个元素范围之内,新建一个元素加入list。反之比较扩大list最后一个元素数据范围。具体代码如下,仅供参考。
具体代码实现
class Solution {
public int[][] merge(int[][] intervals) {
int N = intervals.length;
if (N == 0) {
return new int[0][2];
}
// 先排序
Arrays.sort(intervals, new Comparator<int[]>() {
public int compare(int[] o1, int[] o2) {
return o1[0] - o2[0];
}
});
List<int[]> merge = new ArrayList<int[]>();
for (int i = 0; i < N; i++) {
int k1 = intervals[i][0], k2 = intervals[i][1];
if (merge.size() == 0 || merge.get(merge.size() - 1)[1] < k1) {
merge.add(new int[]{k1,k2});
} else {
merge.get(merge.size() - 1)[1] = Math.max(merge.get(merge.size() - 1)[1],k2);
}
}
return merge.toArray(new int[merge.size()][]);
}
}
评论区