力扣热题100_堆_347_前 K 个高频元素


题目链接

347. 前 K 个高频元素

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]

示例 2:
输入: nums = [1], k = 1
输出: [1]

解题思路

    # 思路:堆(优先队列)
    # 1.初始化计数器:使用defaultdict(int)可以简化计数过程。这样,当我们试图访问一个还未计数的元素时,它的值会自动被初始化为0。
    # 2.统计每个元素的频率:遍历整个数组,对每个元素进行计数。
    # 3.初始化堆:这里使用了一个堆(heap)来存储频率最高的k个元素。堆是一种特殊的树形数据结构,
        # 续:它满足堆属性:即每个父节点的值都小于或等于其子节点的值(对于最小堆)或大于或等于其子节点的值(对于最大堆)。
        # 续:这里我们使用的是最小堆。
    # 4.填充堆:
        #* 当堆的大小小于k时,我们将元素和其频率添加到堆中。
        #* 当堆的大小达到k时,我们检查当前元素的频率是否大于堆顶元素的频率(即频率最高的元素的频率)。
            # 续:如果是,我们将堆顶元素弹出,并将当前元素和其频率添加到堆中。
        #* 使用`(val, key)`这样的元组作为堆的元素是因为`heapq`库默认是最小堆,而我们希望根据频率(即元组的第一个元素)对元素进行排序。
    # 5. 返回结果:最后,我们将堆中的元素按key提取出来并返回,得到频率最高的前k个元素。

解题代码

class Solution:
    def topKFrequent(self,nums, k):
        count = collections.defaultdict(int)
        for num in nums:
            count[num] += 1
        
        heap = []
        for key, val in count.items():
            if len(heap) < k:
                heapq.heappush(heap, (val, key))
            else:
                if val > heap[0][0]:
                    heapq.heappop(heap)
                    heapq.heappush(heap, (val, key))

        return [key for val, key in heap]

参考资料:力扣热题100对应的题解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值