56.合并区间
解题思路:
排序+合并区间
package leadcode;
import java.util.Arrays;
import java.util.Comparator;
/**
* @author : icehill
* @description : 合并区间
* 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。
* 示例 1:
* 输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
* 输出:[[1,6],[8,10],[15,18]]
* 解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
* 示例 2:
* 输入:intervals = [[1,4],[4,5]]
* 输出:[[1,5]]
* 解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。
* 提示:
* 1 <= intervals.length <= 10^4
* intervals[i].length == 2
* 0 <= starti <= endi <= 10^4
* 来源:力扣(LeetCode)
* 链接:https://leetcode-cn.com/problems/merge-intervals
* 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
* 解题思路:
* 排序,合并
* 时间复杂度:O(nlogn) 空间复杂度:O(logn)
* @date : 2021-05-28
*/
public class Solution56 {
public static void main(String[] args) {
Solution56 solution56 = new Solution56();
int[][] intervals={{1,3},{2,6},{8,10},{15,18}};
int[][] merge = solution56.merge(intervals);
for (int i=0;i<merge.length;i++){
System.out.println(Arrays.toString(merge[i]));
}
}
public int[][] merge(int[][] intervals)
{
//按区间其实位置排序
Arrays.sort(intervals, Comparator.comparingInt(v -> v[0]));
// 遍历区间
int[][] res = new int[intervals.length][2];
int index=-1;
//遍历区间
for(int i=0;i<intervals.length;i++){
// 如果结果数组是空的,或者当前区间的起始位置 > 结果数组中最后区间的终止位置,
// 则不合并,直接将当前区间加入结果数组。
if(index==-1||intervals[i][0]>res[index][1]){
res[++index]=intervals[i];
}else{
// 反之将当前区间合并至结果数组的最后区间
res[index][1]=Math.max(res[index][1],intervals[i][1]);
}
}
return Arrays.copyOf(res, index + 1);
}
}