磊磊零基础打卡算法:day11 c++ 区间合并
5.12
区间合并问题:
-
题目描述:给出n段区间,如果区间内,l -r存在交集,那么就可以合并,需要更新区间,如果不存在交集,那么就直接将单独的区间个数++,最后返回区间合并后的区间个数
-
-
解题思路:
-
将区间通过pair进行归类,并排序(可以去除包含的区间,并且可以从小到大排序也方便进行插入,计数);
-
找到没有交集的前后区间,进行计数;
-
找到有交集的区间,进行更换区间;
-
#include iostream #include algorithm #include vector using namespace std; typedef pair<int, int> pii; vector<pii> segs; int n; void merge(vector<pii> &segs) { sort(segs.begin(), segs.end()); //排序后可以将本来是完全子区间的直接去重掉,sort对于pair排序的话,是先对前面进行排序,然后再对后排 vector<pii> res; int st = -2e9, ed = -2e9; //将一开始的左边和右边都置为负无穷 for (auto seg: segs) { //对所有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) //判断是不是原来的segs是不是空的,如果是空的就不加入,如果不是空的,就加入原来segs的最后一个 res.push_back({st, ed}); segs = res; } int main() { cin >> n; for (int i = 0; i < n; i++) { int l, r; cin >> l >> r; segs.push_back({l, r}); } merge(segs); cout << segs.size(); return 0; }
-