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