一、题目描述

二、解题思路
我们使用排序+贪心的算法来合并区间:
-
首先按照区间的左端点 进行排序
-
把第一个区间直接放到result里⭐
-
遍历剩余的intervals数组区间元素,逐个判断是否可以合并
-
若可合并,修改结果result中的最后一个元素**(更新右端点为较大的值)**
-
若不可合并,直接添加到结果result中
三、完整代码
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
vector<vector<int>> result;
// 按照区间左端点排序
sort(intervals.begin(), intervals.end());
for(int i = 0; i < intervals.size(); i++) {
// 如果结果为空或当前区间与结果最后一个区间不重叠
if(result.empty() || result.back()[1] < intervals[i][0]) {
result.push_back(intervals[i]);
}
// 否则合并区间
else {
result.back()[1] = max(intervals[i][1], result.back()[1]);
}
}
return result;
}
};
四、代码解析
1. 排序操作
sort(intervals.begin(), intervals.end());
-
按照区间左端点从小到大排序
-
对于二维数组,默认按第一列(左端点)排序
-
排序后,可能重叠的区间会相邻
2. 结果数组的操作
result.back()[1]
-
result.back():获取结果数组中的最后一个区间 -
[1]:访问该区间的右端点 -
[0]:访问该区间的左端点
3. 判断是否重叠
if(result.empty() || result.back()[1] < intervals[i][0])
-
条件1:结果数组为空,直接添加
-
条件2:当前区间的左端点 > 结果最后一个区间的右端点 → 不重叠
-
满足任一条件就创建新区间
4. 合并区间
result.back()[1] = max(intervals[i][1], result.back()[1]);
-
当前区间与结果中最后一个区间重叠
-
更新结果最后一个区间的右端点
-
取两个区间右端点的较大值
五、语法要点
1. vector v.back()
vector<int> v = {1, 2, 3};
cout << v.back(); // 输出3,最后一个元素
vector<vector<int>> intervals;
intervals.back(); // 返回最后一个区间(一个vector<int>)
intervals.back()[0]; // 访问最后一个区间的左端点
intervals.back()[1]; // 访问最后一个区间的右端点
特点:
-
返回对最后一个元素的引用
-
如果vector为空,调用back()会导致未定义行为
-
通常需要先检查是否为空:
if(!v.empty())
2. 二维vector的排序
vector<vector<int>> intervals;
sort(intervals.begin(), intervals.end());
-
默认按字典序排序:先比较第一个元素,相同再比较第二个
-
这正是我们需要的:按区间左端点排序
3. v.back() 的扩展用法
// 1. 修改最后一个元素
result.back() = {1, 5}; // 直接赋值
// 2. 获取最后一个区间的引用
vector<int>& lastInterval = result.back();
// 3. 使用pop_back()移除最后一个区间
result.pop_back();
// 4. // 获取第一个区间(同样需要确保非空)
result.front();
六、执行示例
输入:[[1,3],[2,6],[8,10],[15,18]]
执行过程:
-
排序后:
[[1,3],[2,6],[8,10],[15,18]] -
i=0: result空 → 添加[1,3]
-
i=1: 当前[2,6], result最后[1,3] → 2<3(重叠) → 合并 → [1,max(3,6)=6]
-
i=2: 当前[8,10], result最后[1,6] → 8>6(不重叠) → 添加[8,10]
-
i=3: 当前[15,18], result最后[8,10] → 15>10(不重叠) → 添加[15,18]
最终结果: [[1,6],[8,10],[15,18]]
七、总结
本文介绍了合并重叠区间的高效算法。通过先按左端点排序,然后遍历并合并重叠区间,我们可以在O(n log n)时间复杂度内解决问题。关键点包括:理解排序的重要性、掌握result.back()的用法、以及正确处理区间的合并逻辑。算法简洁高效,是处理区间问题的经典解法。