贪心,按左端点从小到大排序。
class Solution {
public int[][] merge(int[][] intervals) {
Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0])); // 按左端点从小到大排序
List<int[]> res = new ArrayList<>();
int start = intervals[0][0], end = intervals[0][1];
for(int i = 1; i < intervals.length; i++){
int[] cur = intervals[i];
if(cur[0] <= end){
end = Math.max(end, cur[1]);
}else{
res.add(new int[]{start, end});
start = cur[0];
end = cur[1];
}
}
res.add(new int[]{start, end});
return res.toArray(new int[0][]);
}
}
有时候会忘了按左端点排序还是右端点排序。
一开始写了按右端点从小到大排序
class Solution {
public int[][] merge(int[][] intervals) {
Arrays.sort(intervals, (a, b) -> Integer.compare(a[1], b[1]));
List<int[]> res = new ArrayList<>();
int start = intervals[0][0], end = intervals[0][1];
for(int i = 1; i < intervals.length; i++){
int[] cur = intervals[i];
if(cur[0] <= end){
start = Math.min(start, cur[0]);
end = cur[1];
}else{
res.add(new int[]{start, end});
start = cur[0];
end = cur[1];
}
}
res.add(new int[]{start, end});
return res.toArray(new int[0][]);
}
}
结果会卡在这个测试用例上
再改成按左端点从小到大排序,需要改动的地方也比较少。