问题:
合并所有重叠的区间。
如,输入[[1,3],[2,6],[8,10],[15,18]]
输出[[1,6],[8,10],[15,18]]
思路:
按照区间开始值 对区间进行排序。排序之后,可以合并的区间一定是连续的。每次判断区间的开始和结束是不是分别小于和大于。
题解:
class Solution {
public int[][] merge(int[][] intervals) {
if(intervals.length==0){
return new int[0][2];
}
Arrays.sort(intervals,new Comparator<int[]>(){
public int compare(int[] interval1,int[] interval2){
return interval1[0]-interval2[0];
}
});//匿名内部类实现自定义排序逻辑
List<int[]> merged= new ArrayList<int[]>();//动态数组容器
for(int i=0;i<intervals.length;i++){
int L=intervals[i][0],R=intervals[i][1];
System.out.println(merged.size());
if(merged.size()==0||merged.get(merged.size()-1)[1]<L){
merged.add(new int[]{L,R});//把数组加进去。
}else{
merged.get(merged.size()-1)[1]=Math.max(
merged.get(merged.size()-1)[1],R);
}
}
return merged.toArray(new int[merged.size()][]);//转换为数组
}
}
不使用匿名内部类:
class Solution {
static class IntervalComparator implements Comparator<int[]> {
@Override
public int compare(int[] interval1, int[] interval2) {
return interval1[0] - interval2[0];
}
}
public int[][] merge(int[][] intervals) {
if (intervals.length == 0) {
return new int[0][2];
}
Arrays.sort(intervals, new IntervalComparator());
......同上
}
}
自定义比较器
- 是Java中实现Comparator接口的类。可为不同的数据类型提供不同的排序逻辑。
- 上述代码中创建了一个匿名内部类:
Arrays.sort(intervals, new Comparator<int[]>() {
public int compare(int[] interval1, int[] interval2) {
return interval1[0] - interval2[0];
}
});
实现了Comparator<int[]>接口。compare方法接收两个int[]类型的参数(这里代表两个区间),并根据起始值大小差异返回一个数值:
- 如果interval1[0]-interval2[0]的结果小于0,则方法返回负数。意味着interval1的起始值小于interval2的起始值,表名interval1应该排在2的前面。
- 如果结果等于0,则方法返回0。两个区间的相对位置不变。
- 如果结果大于0,则方法返回正数,1应该排在2之后。
如此,排序完成。
再根据排序结果进行相应的安排。