【演算法】求區間並集的長度
阿新 • • 發佈:2019-01-04
給定數軸上的一些區間,求區間並集的長度。
只需要用一個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的小區域的長度。