问题描述:
给出一个区间的集合,请合并所有重叠的区间。
示例 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] 可被视为重叠区间。
提示:
intervals[i][0] <= intervals[i][1]
解决思路
1.排序,因为测试用例非常的狗
2.合并,主意第一个数和第二个数都要进行判断
/*
*作者:赵星海
*时间:2020/8/28 9:18
*用途:合并区间
*/
public int[][] merge(int[][] intervals) {
//针对类似这种情况 [[1,4],[0,0]] 官方要求输出:[[0,0],[1,4]]
//先排序后合并!!!破用例 搞死我吧
Arrays.sort(intervals, new Comparator<int[]>() {
@Override
public int compare(int[] a, int[] b) {
return a[0] - b[0];
}
});
List<int[]> list = new ArrayList<>();
for (int i = 0; i < intervals.length; i++) {
//拿前一个子数组的尾部数与后一个数组的头部数比较大小,如果前大于后 则合并
int j = i + 1;
//合并区间
while (j < intervals.length
&& (intervals[i][0] > intervals[j][0]
|| intervals[i][1] >= intervals[j][0])) {
if (intervals[i][0] > intervals[j][0]) {
// 针对类似这种情况 [[1,4],[0,4]]
intervals[i][0] = intervals[j][0];
}
if (intervals[i][1] < intervals[j][1]) {
intervals[i][1] = intervals[j][1];
}
j++;
}
//合格数据装填
list.add(intervals[i]);
//装完数据后i跨步,越过不合格数据
i = j - 1;
}
int[][] ints = new int[list.size()][];
for (int i = 0; i < list.size(); i++) {
ints[i] = list.get(i);
}
return ints;
}
LeetCode提交结果: