描述
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。
分析
属于贪心算法的区间题目。
按照左边界排序,排序之后局部最优:每次合并都取最大的右边界,这样就可以合并更多的区间了,整体最优:合并所有重叠的区间。
难点:
- 返回类型是int[][],但数组长度不确定,因此采用List<int[]>类型。
- List<int[]>类型转成intp[][],使用
XXX.toArray(new int[集合长度])
方法。 - 排序之后再来确定start、end。
import java.util.Arrays;
class Solution {
public int[][] merge(int[][] intervals) {
int n = intervals.length;
List<int[]> res = new ArrayList<>();
Arrays.sort(intervals,new Comparator<int[]>(){
public int compare(int[] a, int[] b){
return a[0] - b[0];
}
});
int start = intervals[0][0];
int end = intervals[0][1];
if(n == 1){
res.add(new int[]{start,end});
return res.toArray(new int[1][]);
}
for(int i = 1; i < n; i++){
if(intervals[i][0] <= end){
end = Math.max(end,intervals[i][1]);
}else{
res.add(new int[]{start,end});
start = intervals[i][0];
end = intervals[i][1];
}
}
res.add(new int[]{start,end});
return res.toArray(new int[res.size()][]);
}
}