【算法】求区间并集的长度

来源:互联网 发布:武汉java培训 编辑:程序博客网 时间:2024/06/05 19:34

给定数轴上的一些区间,求区间并集的长度。


只需要用一个cover来记录当前区间覆盖的层数。从左到右遇到一个点就判断:每作过一次区间左端点,cover就加1,每作过一次区间右端点,cover就减1,。显然cover只有正整数和0两种状态,为正数时就将临近两个点所指代的小区间长度加进来。

*求区间并集长度

def howmany(a,b):#求b在列表a中出现的次数    num=0    for i in a:        if i==b:            num+=1    return numleft=[]#存储左端点right=[]#存储右端点allpoint=[]#存储所有点while(1):    x=float(input('左端点'))    y=float(input('右端点'))    if (x==0 and y==0) or (x>y):#输入0 0或者不合法时退出        break    left.append(x)    right.append(y)    allpoint.append(x)    allpoint.append(y)allpoint.sort()#存所有点的list排序cover=0#遇到区间左点时+1,遇到区间右点时-1length=0.0#用于求并区间长度for i in range(len(allpoint)-1):    if allpoint[i+1]==allpoint[i]:#有重复点时跳过去(长度就是0)        continue    cover+=howmany(left,allpoint[i])#加上作左点的次数    cover-=howmany(right,allpoint[i])#减去作右点的次数    if cover==0:#为0时说明不在集合中,跳过去        continue    length+=allpoint[i+1]-allpoint[i]#cover大于0时这个小区间就加进来print ('length=',length)


运行结果:


也可以用最右点减去最左的点得到的长度,依次减去那些cover为0的小区域的长度。

原创粉丝点击