簡體   English   中英

為什么我的限制超出了前k個常見問題[LEETCODE]?

[英]Why is my limit exceeding on the top k frequent question [LEETCODE]?

對於Leetcode的前k個常見問題,我有以下代碼。

允許的時間限制復雜度小於o(nlogn) ,其中n是數組大小

是不是我的大O復雜o(n) 如果是這樣,我為什么還超過時間限制?

def topKFrequent(self, nums, k):
        output = {}
        outlist = []
        for item in nums:
            output[item] = nums.count(item)
        max_count = sorted(output.values(),reverse= True)[:k]
        for key,val in output.items():
            if val in max_count:
                outlist.append(key)
        return (outlist)

testinput:數組[1,1,1,2,2,3,1,1,1,2,2,3] k = 2

測試輸出: [1,2]

問題鏈接: https : //leetcode.com/problems/top-k-frequent-elements/

您的解決方案是O(n^2) ,因為:

for item in nums:
    output[item] = nums.count(item)

對於數組中的每個項目,您要遍歷整個數組以計算相同元素的數量。

無需執行此操作,您可以通過迭代nums並在查找到的每個項目的計數器中加1來獲得O(n)中的計數。

最后的O(n log n)將來自sorted(output.values(), reverse=True)因為每個通用排序算法(包括Timsort)都將是O(n log n)

另一個答案提到,您的計數是O(n^2)時間復雜度,這導致您超過了時間限制。 幸運的是,python在collections模塊中帶有一個Counter對象,該對象將完全按照其他答案的描述進行操作,但是使用的是經過優化的C代碼。 這會將您的時間復雜度降低為O(nlogn)

此外,您可以通過使用min-heap技巧來代替sort調用,從而將時間復雜度降低到O(nlogk) 保持大小為k的最小堆,然后添加其他元素並逐個彈出最小值,直到所有元素都插入(在某個點或另一點)。 堆中剩余的k是您的最大k值。

from collections import Counter
from heapq import heappushpop, heapify


def get_most_frequent(nums, k):
    counts = Counter(nums)
    counts = [(v, k) for k, v in counts.items()]

    heap = counts[:k]
    heapify(heap)

    for count in counts[k:]:
        heappushpop(heap, count)

    return [k for v, k in heap]

如果必須按任何特定順序返回元素,則可以按O(klogk)時間對k元素進行排序,這總體上仍將導致相同的O(nlogk)時間復雜度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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