給定數軸上的一些區間,求區間並集的長度。
只需要用乙個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
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的小區域的長度。
求交集和並集的線性演算法
假設有集合a b 1 求交集,需要得到結果 a b 思路如下 建立乙個雜湊表 hashtable 其鍵 key 表示集合中數字的值,其值 value 表示集合中數字出現的次數 遍歷集合a,將集合中的每個數字 key 插入雜湊表,每個數字的出現次數 value 設定為1 遍歷集合b,對於集合中的每個數...
union 求集合的並集
功能簡介 返回兩個集合的並集。語法格式 1 c union a,b c返回a與b的並集。格式變體 c,ia,ib union a,b ia返回c中元素在a中的位置索引,ib返回c中元素在b中的位置索引。2 c union a,b,rows a與b是列數相同的矩陣,c中的行由a b中的行構成。例項3....
並查集演算法
所謂並查集,它是乙個集合,這個集合的元素也是集合,他支援三種操作 makeset x 建立乙個只有乙個元素x的集合x0,將這個集合放入並查集中 findset x 在並查集中尋找乙個元素s 注意並查集的元素s也是集合 滿足 x屬於s union x,y 將並查集中的元素s1,s2合併,其中x屬於s1...