import java.util.Arrays;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;
/**
* 给出一个区间的集合,请合并所有重叠的区间。
*
* 示例 1:
*
* 输入: [[1,3],[2,6],[8,10],[15,18]]
* 输出: [[1,6],[8,10],[15,18]]
* 解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
* 示例 2:
*
* 输入: [[1,4],[4,5]]
* 输出: [[1,5]]
* 解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
*/
public class SectionMerge {
public static void main(String[] args) {
int[][] intervals = {{1, 3}, {2, 6}, {8, 10}, {15, 18}};
SectionMerge tool = new SectionMerge();
int[][] newIntervals = tool.merge(intervals);
int size = newIntervals.length;
for (int i = 0; i < size; i++) {
System.out.println(Arrays.toString(newIntervals[i]));
}
}
public int[][] merge(int[][] intervals) {
if (intervals.length == 0) {
return new int[0][0];
}
List<Interval> intervalList = Arrays.stream(intervals)
.map(ints -> new Interval(ints[0], ints[1]))
.sorted(Comparator.comparingInt(interval -> interval.start))
.collect(Collectors.toList());
List<Interval> newInterList = new LinkedList<>();
int size = intervals.length;
for (int i = 0; i < size; i++) {
int left = intervalList.get(i).start;
int right = intervalList.get(i).end;
if (newInterList.isEmpty()) {
newInterList.add(intervalList.get(i));
}else if (newInterList.get(newInterList.size() - 1).end < left) {
newInterList.add(intervalList.get(i));
} else {
Interval newLast = newInterList.get(newInterList.size() - 1);
newInterList.remove(newInterList.size() - 1);
newLast.end = Integer.max(newLast.end, intervalList.get(i).end);
newInterList.add(newLast);
}
}
return getIntervalsByIntervalList(newInterList);
}
private int[][] getIntervalsByIntervalList(List<Interval> newInterList) {
int[][] intervals = new int[newInterList.size()][2];
int size = newInterList.size();
for (int i = 0; i < size; i++) {
intervals[i][0] = newInterList.get(i).start;
intervals[i][1] = newInterList.get(i).end;
}
return intervals;
}
private class Interval {
int start;
int end;
public Interval(int start, int end) {
this.start = start;
this.end = end;
}
}
}
代码输出:
[1, 6]
[8, 10]
[15, 18]