题目描述
以数组 intervals
表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi]
。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。
示例 1:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。
提示:
1 <= intervals.length <= 104
intervals[i].length == 2
0 <= starti <= endi <= 104
注意:本题与主站 56 题相同: https://leetcode.cn/problems/merge-intervals/
解法
方法一:区间合并
区间合并,将所有存在交集的区间进行合并。方法是:先对区间按照左端点升序排列,然后遍历区间进行合并。
模板:
def merge(intervals):
ans = []
intervals.sort()
st, ed = intervals[0]
for s, e in intervals[1:]:
if ed < s:
ans.append([st, ed])
st, ed = s, e
else:
ed = max(ed, e)
ans.append([st, ed])
return ans
1
2
3
4
5
6
7
8
9
10
11
12
13 | class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
intervals.sort()
ans = []
st, ed = intervals[0]
for s, e in intervals[1:]:
if ed < s:
ans.append([st, ed])
st, ed = s, e
else:
ed = max(ed, e)
ans.append([st, ed])
return ans
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | class Solution {
public int[][] merge(int[][] intervals) {
Arrays.sort(intervals, Comparator.comparingInt(a -> a[0]));
int st = intervals[0][0], ed = intervals[0][1];
List<int[]> ans = new ArrayList<>();
for (int i = 1; i < intervals.length; ++i) {
int s = intervals[i][0], e = intervals[i][1];
if (ed < s) {
ans.add(new int[] {st, ed});
st = s;
ed = e;
} else {
ed = Math.max(ed, e);
}
}
ans.add(new int[] {st, ed});
return ans.toArray(new int[ans.size()][]);
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
sort(intervals.begin(), intervals.end());
int st = intervals[0][0], ed = intervals[0][1];
vector<vector<int>> ans;
for (int i = 1; i < intervals.size(); ++i) {
int s = intervals[i][0], e = intervals[i][1];
if (ed < s) {
ans.push_back({st, ed});
st = s, ed = e;
} else
ed = max(ed, e);
}
ans.push_back({st, ed});
return ans;
}
};
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | func merge(intervals [][]int) [][]int {
sort.Slice(intervals, func(i, j int) bool {
return intervals[i][0] < intervals[j][0]
})
st, ed := intervals[0][0], intervals[0][1]
var ans [][]int
for _, e := range intervals[1:] {
if ed < e[0] {
ans = append(ans, []int{st, ed})
st, ed = e[0], e[1]
} else if ed < e[1] {
ed = e[1]
}
}
ans = append(ans, []int{st, ed})
return ans
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 | public class Solution {
public int[][] Merge(int[][] intervals) {
intervals = intervals.OrderBy(a => a[0]).ToArray();
int st = intervals[0][0], ed = intervals[0][1];
var ans = new List<int[]>();
for (int i = 1; i < intervals.Length; ++i)
{
int s = intervals[i][0], e = intervals[i][1];
if (ed < s)
{
ans.Add(new int[]{st, ed});
st = s;
ed = e;
}
else
{
ed = Math.Max(ed, e);
}
}
ans.Add(new int[]{st, ed});
return ans.ToArray();
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 | class Solution {
func merge(_ intervals: [[Int]]) -> [[Int]] {
guard !intervals.isEmpty else { return [] }
let intervals = intervals.sorted { $0[0] < $1[0] }
var result: [[Int]] = []
var currentInterval = intervals[0]
for interval in intervals.dropFirst() {
if currentInterval[1] < interval[0] {
result.append(currentInterval)
currentInterval = interval
} else {
currentInterval[1] = max(currentInterval[1], interval[1])
}
}
result.append(currentInterval)
return result
}
}
|