题目
给出一个区间的集合,请合并所有重叠的区间。
示例 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] 可被视为重叠区间。
解题思路
1)首先保存该区间的左端点start和右端点end
2)从该区间的下一个区间开始,依次比较此区间的左端点与上一个区间的右端点,若满足合并条件则记录新合并区间的右端点。注意右端点取当前区间与之前区间右端点的较大值
3)若当前区间不再满足合并条件或者遍历到了集合末尾,就构建新合并区间,其中左端点为初始区间的左端点,右端点为当前所有合并区间右端点的最大值,然后将其加入到结果集合中,接着合并下一个区间
源代码
import java.util.*;
public class Main{
public class Interval{
private int start;
private int end;
Interval(int start,int end){
this.start = start;
this.end = end;
}
@Override
public String toString() {
return "["+start+","+end+"]";
}
}
public static List<Interval> merge(List<Interval> intervals) {
List<Interval> result = new LinkedList<>();
if(intervals == null || intervals.size()<1){
return result;
}
//排序前:[9,10],[1,4],[3,6],[8,12]
System.out.println("排序前:"+intervals.toString());
Collections.sort(intervals,new Comparator<Interval>(){//重写排序方法
@Override
public int compare(Interval o1,Interval o2){
return o1.start - o2.start;
}
});
System.out.println("排序后:"+intervals.toString());
//排序后:[1,4],[3,6],[8,12],[9,10]
Interval prev = null;
for (Interval item : intervals) {
if (prev == null || prev.end < item.start) {
result.add(item);
prev = item;
} else if (prev.end < item.end) {
prev.end = item.end;
}
}
return result;
}
public static void main(String[] args) {
//[9,10],[1,4],[3,6],[8,12]
List<Interval> intervalList = new ArrayList<>();
intervalList.add(new Main().new Interval(9,10));
intervalList.add(new Main().new Interval(1,4));
intervalList.add(new Main().new Interval(3,6));
intervalList.add(new Main().new Interval(8,12));
System.out.println(merge(intervalList).toString());
}
}