题目:
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
来源:力扣(LeetCode)
思路:
1)排序:按照左边界排序!
遍历过程中实时更改右边界,每次进去就查找重叠的区间;左边界进去的时候必然是最小的;
右边界实时改变!
代码:
1)排序 + 贪心:会排序就简单了,按左边界大小排序
class Solution {
//排序 + 贪心
public int[][] merge(int[][] intervals) {
//二维数组的排序,一定先分清楚以哪个维度排序,会得到更好、更合适的结果
//以 头部进行排序,不然会遗失情况
Arrays.sort(intervals,new Comparator<int[]>(){
public int compare(int[] o1,int[] o2){
if(o1[0] == o2[0]) return o1[1] - o2[1];
return o1[0] - o2[0];//按照首列、头部排序
}
});
List<int[]> list = new ArrayList<>();//记录最终结果
for(int i = 0;i < intervals.length;i++){
int start = intervals[i][0];//后面i可能变了,要记住开头的值
int temp = intervals[i][1];
i++;
//此时是重叠的情况
while(i < intervals.length && intervals[i][0] <= temp){
temp = Math.max(temp,intervals[i][1]);//更新右边界:要以最大值来替换
i++;//往后走
}
i--;
int[] arr = new int[]{start,temp};
list.add(arr);
}
return list.toArray(new int[list.size()][]);
}
}