合并区间【LC56】
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。
作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/array-and-string/c5tv3/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
-
思路:模拟
按照左边界排序,排序之后,判断区间和前一个区间是否有重叠部分,有则进行合并;每次合并都取最大的右边界
-
实现
-
先对输入数组按照区间左边的值进行升序排列
-
初始化一个变量 outputs,用于存储合并直接的区间结果
-
遍历排序后的所有区间,针对每个区间做如下的处理:
- 如果当前处理的区间是第一个区间的话,那么直接将区间加入到 outputs
- 比较当前处理区间左边的值 (currLeft) 和 outputs 中最后一个区间右边的值 (outputsLastRight) :
- 如果 outputsLastRight < currLeft,说明没有重叠,那么直接将当前处理的区间加入到 outputs
- 否则,说明有重叠,那么将 outputs 中最后一个区间的右边的值更新为:当前处理区间右边值和 outputsLastRight 的最大值
- 将 outputs 转成数组,并返回
-
代码
public int[][] merge(int[][] intervals){ //1.先对输入数组按照区间左边的值进行升序排列 Arrays.sort(intervals, new Comparator<int[]>() { @Override public int compare(int[] o1, int[] o2) { return o1[0]-o2[0]; } }); //2.初始化一个变量outputs,用于存储合并直接的区间结果 List<int []> outputs = new ArrayList<>(); //将第一个区间直接加入outputs outputs.add(intervals[0]); for (int i = 1; i < intervals.length; i++) { //比较当前处理的区间左边的值和outputs中最后一个区间右边的值 if(intervals[i][0] > outputs.get(outputs.size()-1)[1]){//没有重叠 outputs.add(intervals[i]); }else{ outputs.get(outputs.size()-1)[1] = Math.max(outputs.get(outputs.size()-1)[1],intervals[i][1]); } } //3.转换为数组 return outputs.toArray(new int[outputs.size()][]); }
-
文章描述了解决LeetCode题目中合并所有重叠区间的算法,通过先对区间按左边界排序,然后逐个检查区间与前一个区间是否重叠,合并后返回不重叠的区间数组。
16万+

被折叠的 条评论
为什么被折叠?



