思想
这个算法还是非常简单的,无非就三个情况呗
1.出来就new一个
2.在内部不用管
3.加尾巴就行了
区间合并
上题目:
##代码:
#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
vector<PII> segs;
int n;
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(seg.second, ed);//2,3种情况,取尾巴的最大值!
}
if(st!=-2e9)//存最后一个 顺手预防没有区间
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() << endl;
}
按上述三幅图,来动这个范围还是很好理解的。
三.总结
这个算法还是多敲锻炼熟练度即可,理解还行。