一、问题理解
力扣LCR074题要求我们合并所有重叠的区间。给定一个区间集合,其中每个区间表示为[start, end],我们需要合并所有有重叠的区间,最终返回一个不重叠的区间数组,且这个数组需要恰好覆盖输入中的所有区间。
例如:
输入:[[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠,合并为 [1,6]
二、解决思路
解决这个问题的主要步骤是:
排序:首先将所有区间按照起始点进行排序
合并:然后遍历排序后的区间,逐个合并重叠的区间
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
if (intervals.empty()) return {};
// 1. 按照区间起始点排序
sort(intervals.begin(), intervals.end(), [](const vector<int>& a, const vector<int>& b) {
return a[0] < b[0];
});
vector<vector<int>> merged;
merged.push_back(intervals[0]);
// 2. 遍历并合并重叠区间
for (int i = 1; i < intervals.size(); ++i) {
// 获取最后一个合并后的区间
vector<int>& last = merged.back();
// 如果当前区间与最后一个合并区间重叠
if (intervals[i][0] <= last[1]) {
// 合并区间,取最大的结束点
last[1] = max(last[1], intervals[i][1]);
} else {
// 不重叠,直接添加新区间
merged.push_back(intervals[i]);
}
}
return merged;
}
};