|
| 1 | +package com.cjl.leetcode; |
| 2 | + |
| 3 | +import java.util.*; |
| 4 | + |
| 5 | +/* |
| 6 | + 56. 合并区间 |
| 7 | + 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。 |
| 8 | + 请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。 |
| 9 | + 示例 1: |
| 10 | + 输入:intervals = [[1,3],[2,6],[8,10],[15,18]] |
| 11 | + 输出:[[1,6],[8,10],[15,18]] |
| 12 | + 解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6]. |
| 13 | + 示例2: |
| 14 | + 输入:intervals = [[1,4],[4,5]] |
| 15 | + 输出:[[1,5]] |
| 16 | + 解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。 |
| 17 | + 提示: |
| 18 | + 1 <= intervals.length <= 10^4 |
| 19 | + intervals[i].length == 2 |
| 20 | + 0 <= starti <= endi <= 10^4 |
| 21 | + */ |
| 22 | +public class Question_56 { |
| 23 | + |
| 24 | + public int[][] solution1(int[][] intervals) { |
| 25 | + if(intervals == null || intervals.length == 1){ |
| 26 | + return intervals; |
| 27 | + } |
| 28 | + List<Integer> arr = new ArrayList<>(); |
| 29 | + // 按最小界排序 |
| 30 | + Arrays.sort(intervals, Comparator.comparingInt(a -> a[0])); |
| 31 | + // 记录前面的最大界 |
| 32 | + int preEnd = -1; |
| 33 | + for (int[] interval : intervals) { |
| 34 | + if (interval[0] > preEnd) { |
| 35 | + // 当前最小界大于前面的最大界,不能合并 |
| 36 | + arr.add(interval[0]); |
| 37 | + arr.add(interval[1]); |
| 38 | + }else if (interval[1] > preEnd){ |
| 39 | + // 当前最小界小于或等于前面的最大界,并且当前最大界大于前面的最大界,可合并 |
| 40 | + arr.remove(arr.size() - 1); |
| 41 | + arr.add(interval[1]); |
| 42 | + } |
| 43 | + preEnd = Math.max(preEnd,interval[1]); |
| 44 | + } |
| 45 | + int[][] res = new int[arr.size()/2][2]; |
| 46 | + for (int i = 0; i < arr.size(); i++) { |
| 47 | + res[i/2][i%2] = arr.get(i); |
| 48 | + } |
| 49 | + return res; |
| 50 | + } |
| 51 | +} |
0 commit comments