1
+ // 56. 合并区间
2
+
3
+
4
+ /*
5
+ 遍历区间,加入新区间 或 更新结果数组最后一个区间的右端点值成为新合并区间
6
+ 1、先将列表中的区间按照左端点升序排序
7
+ 2、遍历二维数组
8
+ 1)第一个区间则直接加入结果数组
9
+ 2)如果 结果数组最后一个区间的右端点 小于 当前区间左端点,说明没有重合,当前区间加入结果数组
10
+ 3)如果 结果数组最后一个区间的右端点 大于等于 当前区间左端点,说明有重合,则更新结果数组最后一个区间右端点的值,该值为两右端点取较大者
11
+ 3、列表转数组后返回
12
+
13
+ intervals = [[1,3],[2,6],[8,10],[15,18]] res = [[1,3]]
14
+ ↑
15
+ intervals = [[1,3],[2,6],[8,10],[15,18]] res = [[1,6]]
16
+ ↑
17
+ intervals = [[1,3],[2,6],[8,10],[15,18]] res = [[1,6],[8,10]]
18
+ ↑
19
+ intervals = [[1,3],[2,6],[8,10],[15,18]] res = [[1,6],[8,10],[15,18]]
20
+ ↑
21
+ */
22
+ class Solution {
23
+ public int [][] merge (int [][] intervals ) {
24
+ Arrays .sort (intervals , (a , b ) -> a [0 ] - b [0 ]);
25
+ List <int []> res = new ArrayList <>();
26
+ for (int [] interval : intervals ) {
27
+ int size = res .size ();
28
+ if (size == 0 || res .get (size - 1 )[1 ] < interval [0 ]) {
29
+ res .add (new int []{interval [0 ], interval [1 ]});
30
+ } else {
31
+ res .get (size - 1 )[1 ] = Math .max (res .get (size - 1 )[1 ], interval [1 ]);
32
+ }
33
+ }
34
+ return res .toArray (new int [res .size ()][]);
35
+ }
36
+ }
37
+
38
+
39
+ /*
40
+ 逻辑同上
41
+ */
42
+ class Solution {
43
+ public int [][] merge (int [][] intervals ) {
44
+ Arrays .sort (intervals , (a , b ) -> a [0 ] - b [0 ]);
45
+ int [][] res = new int [intervals .length ][2 ];
46
+ int index = -1 ;
47
+ for (int [] interval : intervals ) {
48
+ if (index == -1 || interval [0 ] > res [index ][1 ]) {
49
+ res [++index ] = interval ;
50
+ } else {
51
+ res [index ][1 ] = Math .max (res [index ][1 ], interval [1 ]);
52
+ }
53
+ }
54
+ return Arrays .copyOf (res , index + 1 );
55
+ }
56
+ }
57
+
58
+
59
+ /*
60
+ 先遍历多个区间,更新区间右端点值,找到一个合并区间后加入结果数组
61
+ */
62
+ class Solution {
63
+ public int [][] merge (int [][] intervals ) {
64
+ Arrays .sort (intervals , (a , b ) -> a [0 ] - b [0 ]);
65
+ List <int []> res = new ArrayList <>();
66
+ int n = intervals .length ;
67
+ for (int i = 0 ; i < n ; i ++) {
68
+ int left = intervals [i ][0 ];
69
+ int right = intervals [i ][1 ];
70
+ while (i < n && right >= intervals [i ][0 ]) {
71
+ right = Math .max (right , intervals [i ][1 ]);
72
+ i ++;
73
+ }
74
+ i --;
75
+ res .add (new int []{left , right });
76
+ }
77
+ return res .toArray (new int [res .size ()][]);
78
+ }
79
+ }
0 commit comments