白痴算法——区间合并(python3)

区间合并:

给定 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

松定

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值