347. 前 K 個高頻元素

HOJEST發表於2024-07-19

初看 題目我的想法是:

1.從數學上來看,只能遍歷到最後,因為前K個的最後一個可能是2,無法透過其他手段去避免

2.最佳化手段是怎麼去找到這個值,並且新增1。因為題目是不需要按順序進行排列的,所以很難想就是這樣硬加,最後排序做。

首先還是實現了一版:

class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        dic = {}
        for num in nums:
            if num not in dic.keys():
                dic[num] = 1
            else:
                dic[num] += 1
        dic = dict(sorted(dic.items(), key = lambda x:x[1], reverse=True))
        result = list(dic.keys())
        return result[:k]

卡在最後三行比較久,不記得sorted的加lambda的用法,以及最後return是list,不能使用dict.keys()[:k]這種方式。

看影片。

對前k個進行排序之前也想到了,比較昨天是隻需要維護一個小雙向佇列嘛,但是這題值維護k個肯定是不夠的,因為後面有可能有新的冒出來進行覆蓋。所以看看大頂堆小頂堆是怎麼做的吧。

看來就是先進行統計,輸出時不對所有元素進行排序(太複雜nlogn),只需要維護一個頻率最高的k個元素進行堆的push和pop。所以主要是堆的認識、小頂堆的理解和應用。

相關文章