算法
区间合并
如果st == -2e9 的话, 相当于传入的segs是个空的,就什么也不放进去,这样segs.size() == 0 相当于没有区间。
这里的 if(st != -2e9) 说明传入了至少有一个区间。
遍历segs时遇到一个新而且在外面的区间,要先push进去上一个维持的区间res.push_back({st, ed});
(如果没有上一个区间,即st == -2e9
,就不放了,直接维持遇到的这个空间),
然后更新遇到的这个新的区间为当前维持的区间。
最后遍历完了,退出时最后正在维持的区间也要push进去。所以遍历完还有一句
if(lt != -2e9) res.push_back({lt, ed});
C++ 代码
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
typedef pair<int, int> PII;
void merge(vector<PII> &segs){
vector<PII> res;
sort(segs.begin(), segs.end());
int lt = -2e9, ed = -2e9;
for(auto seg : segs){
if(seg.first > ed){
if(lt != -2e9) res.push_back({lt, ed});
lt = seg.first;
ed = seg.second;
}
else ed = max(ed, seg.second);
}
if(lt != -2e9) res.push_back({lt, ed});
segs = res;
}
int main(){
vector<PII> segs;
int n;
cin >> n;
while(n--){
int l, r;
scanf("%d%d", &l, &r);
segs.push_back({l, r});
}
merge(segs);
cout << segs.size() << endl;
return 0;
}
陈哥说这个是个贪心的题目,下面是另一个思路也一样的code
对左端点排序以后, 能合并的就合并,不能合并的就新开一个区间。
陈哥的题解
%%%%%%%%%%%
讲得很好
谢谢~