56. 合并区间

描述

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。

链接

56. 合并区间 - 力扣(LeetCode) (leetcode-cn.com)

 

解法

按照左边界从小到大排序之后,如果 intervals[i][0] < intervals[i - 1][1] 即intervals[i]左边界 < intervals[i - 1]右边界,则一定有重复,因为intervals[i]的左边界一定是大于等于intervals[i - 1]的左边界。

即:intervals[i]的左边界在intervals[i - 1]左边界和右边界的范围内,那么一定有重复!

 1 class Solution {
 2     public int[][] merge(int[][] intervals) {
 3         List<int[]> res = new LinkedList<>();
 4         Arrays.sort(intervals, (o1, o2)-> Integer.compare(o1[0],o2[0]));
 5 
 6         int start = intervals[0][0];
 7         for (int i = 1; i < intervals.length; i++) {
 8             if (intervals[i][0] > intervals[i - 1][1]) {
 9                 //无重合的时候
10                 res.add(new int[]{start, intervals[i - 1][1]});
11                 start = intervals[i][0]; // 新的开始
12             } else {
13                 // 有所重合的时候,合并最右侧边界
14                 intervals[i][1] = Math.max(intervals[i][1], intervals[i - 1][1]);
15             }
16         }
17         res.add(new int[]{start, intervals[intervals.length - 1][1]});
18         return res.toArray(new int[res.size()][]);
19     }
20 }

 

参考

carl

posted @ 2021-12-28 21:09  DidUStudy  阅读(25)  评论(0编辑  收藏  举报