![](/img/trans.png)
[英]Why is FloodFill algorithm exceeding Leetcode's maximum recursion limit?
[英]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.