将有交集(包括端点)的区间进行合并
802. 区间和 - AcWing题库
例如,现在有这样一个数据
1 2
2 4
5 6
7 8
7 9
最终合并的结果就是
1 —— 4
5 —— 6
7 —— 9
得到三个区间
第一步:按照区间左端点排序
第二步:扫描整个区间(扫描过程中,合并区间)
维护当前的区间,例如
- 左端点:
st
- 右端点:
ed
存在以下几种情况
区间内
在这种情况下,st和ed都不需要变化
有交集
此时修改ed
,也就是这样
没有交集
因为前面已经将左端点 从小到大 排序,所以很后面的情况只会在紫色点后面,而不会出现在前面
- 然后将此时的st和ed放入答案中
- 并更新st和ed
解决代码
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
typedef pair <int , int > pii;
vector<pii> nums;
void merge(vector<pii> &nums){
vector<pii> res;
int st = -2e9 , ed = -2e9;
for(auto item : nums){
if(item.first > ed){
if(st != -2e9) res.push_back({item.first , item.second});
st = item.first , ed = item.second;
}else{
ed = max(ed , item.second);
}
}
if(st != -2e9){
res.push_back({st , ed});
}
nums = res;
}
int main(){
int n ;
cin >> n;
int l , r;
for(int i = 0 ; i <n ; i ++){
cin >> l >> r;
nums.push_back({l , r});
}
sort(nums.begin() , nums.end());
merge(nums);
cout << nums.size();
return 0;
}
使用pair存放左右端点
- first:左端点
- second:右端点
typedef pair <int , int > pii;
vector<pii> nums;
区间合并模板
sort排序时,是默认排序first,当first相等时,排序second
void merge(vector<pii> &nums){
vector<pii> res;
int st = -2e9 , ed = -2e9;
for(auto item : nums){
if(item.first > ed){
if(st != -2e9) res.push_back({item.first , item.second});
st = item.first , ed = item.second;
}else{
ed = max(ed , item.second);
}
}
if(st != -2e9){
res.push_back({st , ed});
}
nums = res;
}
-
设置默认值为2e9,因为题目默认为109
-
当前区间严格在 维护区间 左边
——(对应没有交集的情况)
-
在区间里面
(对应有交集 + 区间内)