1. 程式人生 > >【演算法】求區間並集的長度

【演算法】求區間並集的長度

給定數軸上的一些區間,求區間並集的長度。


只需要用一個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 num

left=[]#儲存左端點
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,遇到區間右點時-1
length=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的小區域的長度。