题目的链接在这里:https://leetcode-cn.com/problems/merge-intervals/
题目大意
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。一、示意图
二、解题思路
贪心加数组原地修改
贪心加数组原地修改
代码如下:
class Solution {
public int[][] merge(int[][] intervals) {
/**
* 贪心加数组原地修改
*/
//先根据左边界来进行排序 //第二个参数是 Comparator 这个是lambda
/* Arrays.sort(intervals,(o1,o2)->{
return o1[0]-o2[0];
});*/
/**
* 刚好复习一下 Comparator的这个compare函数 compare函数返回值是 int 当他大于0 的时候两个才进行交换 所以o1-o2是一种升序
* Arrays的sort函数则就是 调用了 从o-intervals.length这个方向
* TimSort.sort(a, 0, a.length, c, null, 0, 0);
*/
Arrays.sort(intervals, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[0]-o2[0];
}
});
List<int[]> res=new LinkedList<>();
int start=intervals[0][0];
for(int i=1;i<intervals.length;i++){
//说明这两个数组不能合并 那就把开始的不能合并的位置放入到存储结果中 并进行更新
if(intervals[i][0]>intervals[i-1][1]){
res.add(new int[]{start,intervals[i-1][1]});
//然后更新start
start=intervals[i][0];
}else{
//说明可以合并 那就更新尾巴
intervals[i][1]=Math.max(intervals[i][1],intervals[i-1][1]);
}
}
//最后更新一波
res.add(new int[]{start,intervals[intervals.length-1][1]});
return res.toArray(new int[res.size()][]);
}
}