区间合并:
给定 n 个区间 [li,ri],要求合并所有有交集的区间。
注意如果在端点处相交,也算有交集。
输出合并完成后的区间个数。
例如:[1,3][1,3] 和 [2,6][2,6] 可以合并为一个区间 [1,6][1,6]。
输入格式
第一行包含整数 n。
接下来 n行,每行包含两个整数 l 和 r。
输出格式
共一行,包含一个整数,表示合并区间完成后的区间个数。
输入样例
5
1 2
2 4
5 6
7 8
7 9
输出样例
3
源码:
n=int(input())
res=[]
#存取数据
for i in range(n):
l,r=map(int , input().split())
res.append((l,r))
#对区间数据进行排序,以每个区间的左端点进行升序排序
res.sort(key =lambda x:x[0])
#st表示区间的左端 ed表示右端
st=res[0][0]
ed=res[0][1]
sum=1
#进行区间合并,分为三种情况
for i in range(1,n):
if res[i][1]<=ed: #无需合并
continue
if res[i][0]<=ed and res[i][1]>=ed:#求交集
ed=res[i][1]
if res[i][0]>ed: #无交集 无需合并
sum +=1
st=res[i][0]
ed=res[i][1]
print(sum)
解决这个问题的关键在于对于数据的排序以及三种区间合并的情况:
res.sort(key =lambda x:x[0])
源码中的这一句是用存储的二维数组中的区间左端来进行升序排序,是后面区间合并三种情况的前提。
下面来说一下三种情况:
首先肯定是以1号区间开始的,已经选中的区间以下就成为已做区间,还没有选中的就叫目标区间
首先第一种情况就是1号和2号区间一般,2号区间是包含在1号区间中的,也就是已做区间包含目标区间,这种情况就直接下一个目标区间,这个区间就不用管了。
第二种情况是1号和3号区间之间的关系,之间有交集,要合并区间只需求并集即可,也就是把已做区间的右端换成目标区间即可。
第三种情况是1号和4号区间,之间没有任何联系,这个时候需要用目标区间更新已做区间,然后个数+1