初看 題目我的想法是:
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。所以主要是堆的認識、小頂堆的理解和應用。