以数组 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
方法一:区间合并
区间合并,将所有存在交集的区间进行合并。方法是:先对区间按照左端点升序排列,然后遍历区间进行合并。
模板:
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
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
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()][]);
}
}
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;
}
};
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
}
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();
}
}
function merge(intervals: number[][]): number[][] {
intervals.sort((a, b) => a[0] - b[0]);
let ans: number[][] = [];
let index: number = -1;
for (let interval of intervals) {
if (index == -1 || ans[index][1] < interval[0]) {
// 保留
ans.push(interval);
index++;
} else {
// 求交集
ans[index][1] = Math.max(ans[index][1], interval[1]);
}
}
return ans;
}
function merge(intervals: number[][]): number[][] {
intervals.sort((a, b) => a[0] - b[0]);
const n = intervals.length;
const res = [];
let i = 0;
while (i < n) {
let [l, r] = intervals[i];
i++;
while (i < n && r >= intervals[i][0]) {
r = Math.max(r, intervals[i][1]);
i++;
}
res.push([l, r]);
}
return res;
}
impl Solution {
pub fn merge(mut intervals: Vec<Vec<i32>>) -> Vec<Vec<i32>> {
intervals.sort_unstable_by(|a, b| a[0].cmp(&b[0]));
let n = intervals.len();
let mut res = vec![];
let mut i = 0;
while i < n {
let l = intervals[i][0];
let mut r = intervals[i][1];
i += 1;
while i < n && r >= intervals[i][0] {
r = r.max(intervals[i][1]);
i += 1;
}
res.push(vec![l, r]);
}
res
}
}