803. 区间合并

803. 区间合并

给定 n 个区间 [li,ri],要求合并所有有交集的区间。

注意如果在端点处相交,也算有交集。

输出合并完成后的区间个数。

例如:[1,3] 和 [2,6] 可以合并为一个区间 [1,6]。

输入格式
第一行包含整数 n。

接下来 n 行,每行包含两个整数 l 和 r。

输出格式
共一行,包含一个整数,表示合并区间完成后的区间个数。

数据范围

1≤n≤100000,109≤li≤ri≤109

输入样例:

5
1 2
2 4
5 6
7 8
7 9

输出样例:

3

思路很简单,先将输入按照区间左侧大小排序排序,然后只有两种情况:

  1. 新的区间左侧大于老区间右侧,断裂。
  2. 两个区间存在交集,合并

代码:

#include
#include
#include
using namespace std;

int n;
int x, y;
vector<pair<int, int>> v;
int main() {
    cin >> n;
    while (n-- ){
        cin>>x>>y;
        v.push_back({x,y});
    }
    sort(v.begin(),v.end());
    //先插入第一个区间的值,保持代码一致 处理边界问题
    int l = v.begin()->first;
    int r = v.begin()->second;
    int res = 1;
    for(auto i = v.begin()+1; i != v.end(); i++){
        int ll = i->first;
        int rr = i->second;
        //发生断裂
        if(ll>r){
            res++;
            l = ll;
            r = rr;
        }else{ //合并
            l = max(ll,l);
            r = max(rr,r);
        }
    }
    cout<<res;
}

你可能感兴趣的:(刷题)