1236:区间合并 易错题

首先储存区间,不必多言

struct node
{
	int a,b;
	
} s[55010];

刚开始的想法是想先把所有的子区间按从小到大的顺序排列。

先排左端点,左端点相同再排右端点

[1,4]

[2,3]

[3,6]

bool compare(node a,node b)
{
	if(a.a==b.a) return a.b<b.b;
	else
	return a.a<b.a;
	
}

然后遍历排好序的所有结点

	for(int i=1;i<n;i++)
	{
		if(s[i].b<s[i+1].a||s[i].a>s[i].b)
		{
			printf("no\n");
			return 0;
		}
	}

如果这个区间的右端点小于下一个区间的左端点

那么这两个区间就没有交集,返回false

这里忽略了一种情况

[1,10]

[5,6]

[7,9]

区间2和区间3是没有交集的,按上面的代码会返回false

所以我们应该记录整个区间的左右端点,看这个区间是否与前i-1个区间的总的区间有交集

可以声明两个变量来记录左右端点

	int l=s[1].a;
	int r=s[1].b;

如果①当前区间的左端点大于前面区间组成的总区间的右端点

或者②当前区间的右端点小于前面组成的总区间的左端点

就是不符合题意的情况了 

因为我们排过序,所以后面的区间的左端点都是满足①的

条件②其实不存在,因为我们排过序了,当前区间的右端点如果小于前面总区间的左端点,也就是当前区间的左端点小于前面总区间的右端点,这个区间会直接被排到前面,然后形成条件①的情况

故只需判断当前区间左端点与总区间的右端点即可

	for(int i=2;i<n;i++)
	{
//		printf("%d %d\n",s[i].a,s[i].b);
		if(s[i].a>s[i].b)
		{
			printf("no\n");
			return 0;
		}
		if(s[i].a>r)
		{
			printf("no");
			return 0;
		}
		r=r>s[i].b?r:s[i].b;
	}

posted @ 2022-09-17 19:35  LZH_03  阅读(57)  评论(0编辑  收藏  举报