给定一堆区间,可能存在交集,对区间进行合并返回没有交集的区间集合。本文记录了这种问题的一种解法
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
public class Test2 {
public static void main(String[] args) {
int[][] intervals = new int[5][2];
intervals[0] = new int[]{1,3};
intervals[1] = new int[]{2,5};
intervals[2] = new int[]{3,8};
intervals[3] = new int[]{9,10};
intervals[4] = new int[]{2,6};
List<int[]> res = mergeIntervals(intervals);
for (int[] arr : res) {
System.out.println(Arrays.toString(arr));
}
}
//合并区间,把多个有交集的区间进行合并,最后返回没有交集的区间集合
// [[1,3],[2,5],[3,8],[9,10],[2,6]]
public static List<int[]> mergeIntervals(int[][] intervals) {
if (null == intervals) {
throw new ArithmeticException("参数不能为null");
}
List<int[]> res = new ArrayList<>();
if (intervals.length < 2) {
res.add(new int[]{intervals[0][0], intervals[0][1]});
}
//按区间左端点升序排列
Arrays.sort(intervals, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[0] - o2[0];
}
});
int start = intervals[0][0];
int end = intervals[0][1];
int i=1;
while(i< intervals.length) {
int[] current = intervals[i];
// 前一个区间的终点<下一个的起点,区间是断开的,[star,end]可以加入结果集
if(end<current[0]) {
res.add(new int[]{start,end});
start = current[0];
end =current[1];
} else {
//前一个和下一个有交集,修改end为前一个终点和下一个终点的最大值
int max =Math.max(end,current[1]);
end =max;
}
i++;
}
//合并结束,把start,end加入结果集
res.add(new int[]{start,end});
return res;
}
}