簡體   English   中英

查找名稱是否存在於三個大小相等的列表中

[英]Find if the name is present in three lists of equal size

我有三個列表,每個列表都有 n 個名字。 我必須找出每個列表中是否有一個名稱,並按字典順序返回它。 時間復雜度必須為 O(n*log(n))。 我嘗試了以下方法:

  1. 對三個列表中的每一個進行排序 - 即 3n*log(n)
  2. 遍歷一個列表,並將您當前所在的名稱與其他列表中的名稱進行比較,“忘記”您已經訪問過的名稱。 在 Python 上,它應該看起來像這樣:
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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM