|
| 1 | +```text |
| 2 | +题目: 给出一个区间的集合,请合并所有重叠的区间; |
| 3 | + 示例 1: |
| 4 | + 输入: intervals = [[1,3],[2,6],[8,10],[15,18]] |
| 5 | + 输出: [[1,6],[8,10],[15,18]] |
| 6 | + 解释: 区间 [1,3] 和 [2,6] 重叠,将它们合并为 [1,6] |
| 7 | + 示例 2: |
| 8 | + 输入: intervals = [[1,4],[4,5]] |
| 9 | + 输出: [[1,5]] |
| 10 | + 解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间 |
| 11 | +1.双指针: |
| 12 | + [1]思路: |
| 13 | + (1)题中未指明数组排好序,在乱序的情况下很难做区间合并,因此首先对二维数组排序; |
| 14 | + (按每个内部数组的第一个元素从小到大排序) |
| 15 | + (2)定义两个指针,一个用来遍历数组(内部数组所在的下标),一个用来结果数组中正在操作的位置(添加或合并); |
| 16 | + (3)若是首次添加或遍历到的数组的第一个元素小于已添加的最后一个数组的第二个元素,则直接添加到结果数组; |
| 17 | + (4)否则需要进行数组的合并,因第一个元素是排好序的,取这两个数组第二个元素的最大值作为合并后数组的第二个元素; |
| 18 | + [2]实现: |
| 19 | + class Solution { |
| 20 | + public int[][] merge(int[][] intervals) { |
| 21 | + int len = intervals.length; |
| 22 | + if (len <= 1) { |
| 23 | + return intervals; |
| 24 | + } |
| 25 | + // 按内部数组的第一个元素的大小来排序 |
| 26 | + Arrays.sort(intervals, Comparator.comparingInt(a -> a[0])); |
| 27 | + int[][] result = new int[len][2]; |
| 28 | + int index = -1; |
| 29 | + // for(int i=0;i<intervals.length;i++){}简化而来 |
| 30 | + for (int[] interval : intervals) { |
| 31 | + if (index == -1 || result[index][1] < interval[0]) { |
| 32 | + result[++index] = interval; |
| 33 | + } else { |
| 34 | + result[index][1] = Math.max(result[index][1], interval[1]); |
| 35 | + } |
| 36 | + } |
| 37 | + return Arrays.copyOf(result, index + 1); |
| 38 | + } |
| 39 | + } |
| 40 | + [3]复杂度分析: |
| 41 | + (1)时间复杂度:O(n) |
| 42 | + 其中n为intervals数组的长度,只需要遍历一遍数组即可求得答案; |
| 43 | + (2)空间复杂度: O(n) |
| 44 | +``` |
0 commit comments