41
41
42
42
** 方法一:区间合并**
43
43
44
- 区间合并,将所有存在交集的区间进行合并。方法是:先对区间 ** 按照左端点升序排列 ** ,然后遍历区间进行合并 。
44
+ 这道题是一道典型的区间合并问题,即给定一些区间,要求将所有有交集的区间合并成一个区间 。
45
45
46
- 模板:
46
+ 我们可以将区间按照左端点升序排列,然后遍历区间进行合并操作。
47
+
48
+ 模板如下:
47
49
48
50
``` python
49
51
def merge (intervals ):
@@ -60,6 +62,8 @@ def merge(intervals):
60
62
return ans
61
63
```
62
64
65
+ 时间复杂度 $O(n \times \log n)$,空间复杂度 $O(\log n)$。其中 $n$ 为区间个数。
66
+
63
67
<!-- tabs:start -->
64
68
65
69
### ** Python3**
@@ -118,12 +122,13 @@ public:
118
122
int st = intervals[ 0] [ 0 ] , ed = intervals[ 0] [ 1 ] ;
119
123
vector<vector<int >> ans;
120
124
for (int i = 1; i < intervals.size(); ++i) {
121
- int s = intervals[ i] [ 0 ] , e = intervals[ i] [ 1 ] ;
122
- if (ed < s) {
125
+ if (ed < intervals[ i] [ 0 ] ) {
123
126
ans.push_back({st, ed});
124
- st = s, ed = e;
125
- } else
126
- ed = max(ed, e);
127
+ st = intervals[ i] [ 0 ] ;
128
+ ed = intervals[ i] [ 1 ] ;
129
+ } else {
130
+ ed = max(ed, intervals[ i] [ 1 ] );
131
+ }
127
132
}
128
133
ans.push_back({st, ed});
129
134
return ans;
@@ -134,12 +139,11 @@ public:
134
139
### **Go**
135
140
136
141
```go
137
- func merge(intervals [][]int) [][]int {
142
+ func merge(intervals [][]int) (ans [][]int) {
138
143
sort.Slice(intervals, func(i, j int) bool {
139
144
return intervals[i][0] < intervals[j][0]
140
145
})
141
146
st, ed := intervals[0][0], intervals[0][1]
142
- var ans [][]int
143
147
for _, e := range intervals[1:] {
144
148
if ed < e[0] {
145
149
ans = append(ans, []int{st, ed})
@@ -161,21 +165,16 @@ public class Solution {
161
165
intervals = intervals .OrderBy (a => a [0 ]).ToArray ();
162
166
int st = intervals [0 ][0 ], ed = intervals [0 ][1 ];
163
167
var ans = new List <int []>();
164
- for (int i = 1 ; i < intervals .Length ; ++ i )
165
- {
166
- int s = intervals [i ][0 ], e = intervals [i ][1 ];
167
- if (ed < s )
168
- {
169
- ans .Add (new int []{st , ed });
170
- st = s ;
171
- ed = e ;
172
- }
173
- else
174
- {
175
- ed = Math .Max (ed , e );
168
+ for (int i = 1 ; i < intervals .Length ; ++ i ) {
169
+ if (ed < intervals [i ][0 ]) {
170
+ ans .Add (new int [] { st , ed });
171
+ st = intervals [i ][0 ];
172
+ ed = intervals [i ][1 ];
173
+ } else {
174
+ ed = Math .Max (ed , intervals [i ][1 ]);
176
175
}
177
176
}
178
- ans .Add (new int []{ st , ed });
177
+ ans .Add (new int [] { st , ed });
179
178
return ans .ToArray ();
180
179
}
181
180
}
@@ -186,18 +185,17 @@ public class Solution {
186
185
``` ts
187
186
function merge(intervals : number [][]): number [][] {
188
187
intervals .sort ((a , b ) => a [0 ] - b [0 ]);
189
- let ans: number [][] = [];
190
- let index: number = - 1 ;
191
- for (let interval of intervals ) {
192
- if (index == - 1 || ans [index ][1 ] < interval [0 ]) {
193
- // 保留
194
- ans .push (interval );
195
- index ++ ;
188
+ const ans: number [][] = [];
189
+ let [st, ed] = intervals [0 ];
190
+ for (const [s, e] of intervals .slice (1 )) {
191
+ if (ed < s ) {
192
+ ans .push ([st , ed ]);
193
+ [st , ed ] = [s , e ];
196
194
} else {
197
- // 求交集
198
- ans [index ][1 ] = Math .max (ans [index ][1 ], interval [1 ]);
195
+ ed = Math .max (ed , e );
199
196
}
200
197
}
198
+ ans .push ([st , ed ]);
201
199
return ans ;
202
200
}
203
201
```
0 commit comments