演算法 求區間並集的長度

2021-08-01 18:46:22 字數 1186 閱讀 4439

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

只需要用乙個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...