也是常规思路:
1.先按start排序
2.比较后一个区间start和前一个区间的end,说明是否肯定有重叠。
- 比较后一个区间end和前一个区间的end,是否被前面包含。
经过三次按测试用例的提示Ac 13%:
class Solution {
public:
//给出一个区间的集合,请合并所有重叠的区间。
static bool comp(Interval a, Interval b)
{
return a.start<b.start;
}
vector<Interval> merge(vector<Interval>& intervals) {
int len = intervals.size();
sort(intervals.begin(), intervals.end(), comp);
for (int i = 0; i < len; i++)
{
if (i != 0 && intervals[i - 1].end >= intervals[i].start&&intervals[i - 1].end <= intervals[i].end)
{
intervals[i - 1].end = intervals[i].end;
intervals.erase(intervals.begin() + i);
len--;
i--;//继续从当前的看
}
if (i != 0 && intervals[i - 1].end >= intervals[i].start&&intervals[i - 1].end>intervals[i].end)
{
intervals.erase(intervals.begin() + i);
len--;
i--;
}
}
return intervals;
}
};
在[1]中我发现,确实自己的erase调用多花费时间,不如借助一个辅助容器。
Ac 8ms:
class Solution {
public:
//给出一个区间的集合,请合并所有重叠的区间。
static bool comp(Interval a, Interval b)
{
return a.start<b.start;
}
vector<Interval> merge(vector<Interval>& intervals) {
int len = intervals.size();
vector<Interval>res;
if (len == 0)return res;
sort(intervals.begin(), intervals.end(), comp);
Interval cur = intervals[0];
const vector<Interval>& v = intervals;
for (int i = 1; i < len; i++)
{
if (cur.end >= v[i].start)//must overlap滑动窗口
{
cur.end = max(cur.end, v[i].end);
}
else
{
res.push_back(cur);
cur = v[i];
}
}
res.push_back(cur);
return res;
}
};
static const auto kSpeedUp = []() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
return nullptr;
}();
[1]https://blog.csdn.net/u010246947/article/details/78242175