题目
以数组 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] 可被视为重叠区间。
分析
排序法
首先,按区间的起始值进行排序。然后遍历每一个区间,检查当前区间是否与合并结果中的最后一个区间重叠。如果没有重叠,就直接将当前区间添加到结果中。如果有重叠,就更新合并数组中的最后一个区间的结束值。
时间复杂度:O(),
为区间数量
空间复杂度:O(),
为区间数量
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
// 如果输入为空,直接返回空数组
if (intervals.empty()) return {};
// 按照区间的起始值排序
sort(intervals.begin(), intervals.end());
// 用一个新的数组存储合并后的区间
vector<vector<int>> merged;
// 遍历每个区间
for (const auto& interval : intervals) {
// 如果合并数组为空,或者当前区间与合并数组的最后一个区间不重叠
if (merged.empty() || merged.back()[1] < interval[0]) {
merged.push_back(interval); // 直接加入新区间
} else {
// 否则,合并区间,更新最后一个区间的结束值
merged.back()[1] = max(merged.back()[1], interval[1]);
}
}
return merged;
}
};
知识充电
vector() 容器
vector() 是 C++ 标准库提供的一种动态数组容器。它的大小可以在运行时自动调整。与传统的数组不同,vector() 能够动态地增加和减少元素,并且提供了许多操作方法来方便地处理数据。
初始化
#include <vector>
std::vector<int> v1; // 创建一个空的vector
std::vector<int> v2(5, 10); // 创建一个包含 5 个元素,每个元素初始化为 10 的vector
std::vector<int> v3 = {1, 2, 3, 4}; // 使用初始化列表创建vector
std::vector<int> v4(v3); // 通过拷贝构造函数创建一个新vector
常用成员函数
size()——返回 vector 中元素的数量
empty()——检查 vector 是否为空
resize()——改变 vector 的大小。若新大小大于原大小,新增的元素将被初始化为零(对于基础数据类型);若新大小小于原大小,vector 的大小将被减少到新大小
v3.resize(6, 100); // 将 v3 的大小扩展到 6,并初始化新元素为 100
push_back()——向 vector 的末尾添加一个新元素
pop_back()——删除 vector 中的最后一个元素
front()——返回 vector 中的第一个元素
back()——返回 vector 中的最后一个元素
data()——指向第一个元素的指针
clear()——清空所有元素
insert()——在指定位置插入一个或多个元素
v3.insert(v3.begin() + 2, 50); // 在索引为 2 的位置插入元素 50
v3.insert(v3.begin(), 2, 30); // 在开始位置插入 2 个 30
erase()——删除指定位置的元素,或者删除指定范围内的元素
v3.erase(v3.begin() + 2); // 删除索引为 2 的元素
v3.erase(v3.begin(), v3.begin() + 2); // 删除前两个元素
swap()——交换两个 vector 的内容
std::vector<int> v5 = {10, 20, 30};
v3.swap(v5); // 交换 v3 和 v5 的内容
494

被折叠的 条评论
为什么被折叠?



