一、定义
区间合并指将一组具有重叠或相邻区间的集合,通过合并相交的区间,得到一个不重叠且尽可能合并的新区间集合。
例如,区间:[0, 2]、[1, 6]、[7, 9]、[10, 15]、[12, 20],以上五个区间的合并结果为[0, 6]、[7, 9]、[10, 20]。
二、代码
void merge(vector<PII> &segs){
vector<PII> res;
sort(segs.begin(), segs.end());
int st = -2e9, ed = -2e9;
for(auto seg : segs)
if(ed < seg.first){
if(st != -2e9)
res.push_back({st, ed});
st = seg.first, ed = seg.second;
}
else
ed = max(ed, seg.second);
if(st != -2e9)
res.push_back({st, ed});
swap(segs, res);
}
为什么需要一下两行代码呢?
if(st != -2e9)
res.push_back({st, ed});
原因:
这两行代码的作用是将最后一个合并后的区间(st和ed表示起始和结束值)添加到结果向量res中。
在循环结束后,如果st不等于初始值-2e9(即在循环中找到了至少一个区间),则将最后一个合并后的区间(st和ed)添加到res向量中。这是因为循环只在遇到新的不相交区间时才更新st和ed,而最后一个区间可能没有新的不相交区间来触发更新。因此,需要在循环结束后将最后一个区间添加到结果中。