347. 前 K 个高频元素

初看 题目我的想法是:

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。所以主要是堆的认识、小顶堆的理解和应用。

posted @ 2024-07-19 00:08  HOJEST  阅读(7)  评论(0)    收藏  举报