一、题目
二、代码
贪心算法:
- 先按照区间左端点的值升序排序
-
如果当前遍历到的区间的左端点大于结果集中最后一个区间的右端点,说明它们没有交集,此时把区间添加到结果集
-
如果当前遍历到的区间的左端点小于结果集中最后一个区间的右端点,说明它们有交集,合并
此题知识点较多,通过实现Comparator接口来自定义排序以及链表到二维数组的转化等
class Solution {
public int[][] merge(int[][] intervals) {
if(intervals.length < 2) return intervals;
// 排序:根据区间开始值升序
// Arrays.sort(intervals, (v1, v2) -> v1[0] - v2[0]);
Arrays.sort(intervals, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[0] - o2[0];
}
});
LinkedList<int []> result = new LinkedList<>();
//将排好序的第一个元素放入结果集中
result.add(intervals[0]);
for(int i = 1; i < intervals.length; i++){
if(result.getLast()[1] < intervals[i][0]){
//此时一维数组代表区间
result.add(intervals[i]);
}else{
//定义一个last变量指向从结果集取出的数组
int[] last = result.getLast();
last[1] = Math.max(last[1], intervals[i][1]);
}
}
return result.toArray(new int[result.size()][]);
}
}