BM89 合并区间
知识点排序数组
描述
给出一组区间,请合并所有重叠的区间。请保证合并后的区间按区间起点升序排列。
数据范围:区间组数 ,区间内 的值都满足
要求:空间复杂度
,时间复杂度
进阶:空间复杂度
,时间复杂度
示例1
输入:
[[10,30],[20,60],[80,100],[150,180]]
复制返回值:
[[10,60],[80,100],[150,180]]
复制
示例2
输入:
[[0,10],[10,20]]
复制返回值:
[[0,20]]
题解
思路:
- 如果输入为空,返回空
- 对输入进行排序,此时需要给std::sort指定排序函数
- 将排序后的第一个元素放入结果中v
- 遍历排序后的输入数据,比较v.back和当前元素的值,决定是合并,还是放入v的后面
代码如下:
struct Interval
{
int start;
int end;
Interval() : start(0), end(0) {}
Interval(int s, int e) : start(s), end(e) {}
};
std::vector<Interval> merge(std::vector<Interval> &intervals)
{
std::vector<Interval> v;
if (intervals.empty())
{
return v;
}
std::sort(intervals.begin(), intervals.end(), [](const Interval &a, const Interval &b)
{
if (a.start < b.start)
{
return true;
}
if (b.start < a.start)
{
return false;
}
return a.end < b.end; });
v.push_back(intervals[0]);
for (int i = 1; i < intervals.size(); ++i)
{
const auto &x = intervals[i];
if (x.start >= v.back().start && x.start <= v.back().end)
{
v.back().end = std::max(x.end, v.back().end);
}
else
{
v.push_back(x);
}
}
return v;
}