区间合并算法 模板

213 阅读1分钟

0合并区间 - 蓝桥云课 (lanqiao.cn)

视频解析:803. 区间合并 - AcWing题库

思想

我们把每个区间按照左端点排序,这样的话其他区间对于第一个区间来说只有三种情况:

image.png

除了有交集的情况可以合并之外,其他的情况都是独立的区间,无法合并:

合并的时候我们只需要更新右端点为两个区间较大的那个右端点即可: image.png

#include<bits/stdc++.h>
using namespace std;
const int N=1010;
typedef pair<int,int>PII; 
vector<PII>v;


void merge(int n)
{
	//首先载入第一个区间
	PII t={v[0].first,v[0].second};
	
	//先拿第二个区间与第一个区间进行比较
	for(int i=1;i<n;i++)
	{
		if(t.second>=v[i].first)  //第二个区间的左端点小于第一个区间的右端点,那么就可以合并
		{
		  //右端点更新为较大的那个右端点
		  t.second=max(t.second,v[i].second);
		}
		else  //没有产生交集,都是独立的区间 
		{
			cout<<t.first<<" "<<t.second<<endl;
			t=v[i];  //更新为下一段区间 
	    }
	} 
	//最后一段区间
	cout<<t.first<<" "<<t.second<<endl; 
}
int main()
{
	int n;cin>>n;
	for(int i=0;i<n;i++)
    {
    	int a,b;cin>>a>>b;
    	v.push_back({a,b});
	}

    sort(v.begin(),v.end());  //pair默认按照first排序,这里就是左端点 
	merge(n); 
	return 0;
}