这道题可以用列表来写,首先对所有的数组区间依据第一个数字进行排序,然后创建一个数组列表存放合并重叠后的结果。
如果列表为空,或者当前区间的起始位置大于列表中区间的最后一个位置,则不重叠直接插入列表,否则合并区间。
这里合并起始位置不变,依据区间末尾最大的那个数作为结尾。
最后利用toArray方法,把列表转成二维数组输出。
代码如下:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
// 合并区间
public class Solution2 {
public int[][] merge(int[][] intervals) {
//首先对区间按照起始位置进行排序
Arrays.sort(intervals, Comparator.comparing(a->a[0]));
List<int[]>merged=new ArrayList<>();
//遍历排序后的区间
for(int[] interval:intervals){
//如果结果列表为空,或者当前区间的起始位置大于结果列表中最后一个区间的结束位置
//则说明没有重叠,直接将当前区间添加到结果列表中
if(merged.isEmpty()||merged.get(merged.size()-1)[1]<interval[0]){
merged.add(interval);
}
else {
//存在重叠需要合并区间
merged.get(merged.size()-1)[1]=Math.max(merged.get(merged.size()-1)[1],interval[1]);
}
}
//将结果列表转换成二维数组并返回
return merged.toArray(new int[merged.size()][]);
}
}
1.比较器
Comparator.comparingInt(a -> a[0])
创建了一个比较器,该比较器根据整数数组的第一个元素的值来比较两个整数数组。如果第一个数组的第一个元素小于第二个数组的第一个元素,则比较器认为第一个数组“小于”第二个数组(在排序的上下文中)。
2.区间比较
merged.get(merged.size()-1)[1] < interval[0]
:这个条件判断语句的意思是,如果merged
列表中最后一个区间的结束位置小于当前interval
区间的起始位置,则条件为真。这种情况表明merged
列表中的最后一个区间与interval
区间没有重叠,因为它们的结束位置和起始位置之间有空隙。