[英]Find if the name is present in three lists of equal size
我有三個列表,每個列表都有 n 個名字。 我必須找出每個列表中是否有一個名稱,並按字典順序返回它。 時間復雜度必須為 O(n*log(n))。 我嘗試了以下方法:
def find_name(arr1, arr2, arr3):
arr1.sort()
arr2.sort()
arr3.sort()
idx2 = idx3 = 0
for name in arr1:
while idx2 < len(arr2)-1 and name > arr2[idx2]:
idx2 += 1
while idx3 < len(arr3)-1 and name > arr3[idx3]:
idx3 += 1
if name == arr2[idx2] == arr3[idx3]:
return name
return -1
它適用於某些輸入,但我仍然認為我缺少一些東西。
編輯:我已經更新了我的解決方案。 它產生的結果與 Nick 的解決方案相同,盡管他的解決方案顯然要快得多(但我的任務恰好需要這個)。
您可以使用 set intersection 來查找三個列表中每個列表之間的公共名稱; 這是轉換和交集的 O(n)。 然后你可以取該集合的最小值,也就是 O(n)。 例如:
def find_name(arr1, arr2, arr3):
s1 = set(arr1)
s2 = set(arr2)
s3 = set(arr3)
common = s1.intersection(s2, s3)
return min(common) if len(common) else -1
arr1 = ['bill', 'fred', 'nick', 'jim']
arr2 = ['john', 'nick', 'fred', 'jim']
arr3 = ['jim', 'fred', 'nick', 'joe']
print(find_name(arr1, arr2, arr3))
Output:
fred
如果需要,這可以簡化為:
def find_name(arr1, arr2, arr3):
common = set.intersection(set(arr1), set(arr2), set(arr3))
return min(common) if len(common) else -1
甚至更進一步:
def find_name(arr1, arr2, arr3):
return min(set(arr1).intersection(arr2, arr3), default=-1)
感謝@solid.py 和@superbrain 的代碼改進。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.