合并区间链接
暴力法失败了,其实很好模拟,唯一的问题就是interval很难有序,结果答案告诉我可以直接sort。。。
代码:
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
// 如果输入的区间列表为空,直接返回空列表
if (intervals.size() == 0) {
return {};
}
// 首先将所有区间按照左边界进行排序,以便后续合并
sort(intervals.begin(), intervals.end());
// 用来存储合并后的区间列表
vector<vector<int>> merged;
// 遍历所有区间
for (int i = 0; i < intervals.size(); ++i) {
// 获取当前区间的左右边界
int L = intervals[i][0], R = intervals[i][1];
// 如果 merged 为空,或者当前区间无法与 merged 的最后一个区间重叠
if (!merged.size() || merged.back()[1] < L) {
// 将当前区间添加到 merged 中
merged.push_back({L, R});
}
else {
// 否则,当前区间与 merged 的最后一个区间重叠,更新最后一个区间的右边界
merged.back()[1] = max(merged.back()[1], R);
}
}
// 返回合并后的区间列表
return merged;
}
};
那到底sort(intervals.begin(), intervals.end());是什么意思呢?
- sort(intervals.begin(), intervals.end()); 这行代码用于对 intervals 进行排序,其中 intervals 是一个二维数组(向量),即 vector<vector>。在这种情况下,sort 函数会根据默认的排序规则对 intervals 进行排序。对于二维数组来说,默认的排序规则是按照字典序进行排序,即首先比较第一列的元素,如果第一列的元素相等,则比较第二列的元素,以此类推。
具体排序规则:
第一列(左边界)排序:sort 函数首先会根据每个子数组(或区间)的第一个元素(即左边界)进行升序排序。也就是说,如果区间 a = [a1, a2] 和区间 b = [b1, b2],那么如果 a1 < b1,则区间 a 排在区间 b 之前。
第二列(右边界)排序:如果两个子数组的第一个元素相等,则比较它们的第二个元素(即右边界)。例如,如果 a1 == b1,则比较 a2 和 b2,如果 a2 < b2,则区间 a 排在区间 b 之前。
- 示例说明:
假设 intervals 为以下二维向量:
vector<vector<int>> intervals = {{1, 3}, {2, 6}, {8, 10}, {2, 4}, {7, 9}};
使用 sort(intervals.begin(), intervals.end()); 进行排序后,intervals 将会变成:
{{1, 3}, {2, 4}, {2, 6}, {7, 9}, {8, 10}}
排序过程:
- 首先比较每个区间的第一个元素进行排序,因此 1 在最前面,然后是 2 开头的区间,依次类推。
- 对于开头相同的区间 {{2, 6}, {2, 4}},因为 4 < 6,所以 {{2, 4}} 排在 {{2, 6}} 之前。
- 这种字典序的排序方式使得 sort 函数能够有效地对二维向量进行排序,适用于许多需要对区间或其他多维数据进行排序的场景。