来自北大算法课的Leetcode题解:347. 前K个高频元素

本文介绍了在Python中处理找出列表中出现频率最高的前k个元素的四种解法,包括基于字典排序、堆(heapq)和自定义堆的实现,以及一种改进的堆操作技巧。适合理解不同场景下如何优化查找频繁元素的算法效率。
摘要由CSDN通过智能技术生成

代码仓库Github | Leetcode solutions @doubleZ0108 from Peking University.

  • 解法1(T97% S91%): 乍一看很像堆的题,但最终要找的是次数最大的几个,因此不用那么复杂。首先一次循环用字典储存每个元素出现的次数,然后按照value对dict排序,排序后得到的是一个二元数组,选取前k个数组元素输出key就好

  • 解法2(T71% S81%): 因为题说了可以按任意顺序返回,所以也可以通过堆来做,首先还是一次遍历获取统计字典,然后直接调用heapq的nlargest获取前k大个元素,key是table中的value

    res = heapq.nlargest(k, table, key=lambda kk: table[kk])
    
  • 解法3(T97% S43%): 还是用堆,不过堆插入删除的逻辑自己写。首先把所有table中的元素按照value值插入heap(python的heapq只能使用默认的最小堆),然后再循环进行根的pop直到剩下k个元素

    • 改进1(T99% S80%): 全插入再删除太费时,堆中只要时刻维护k个数就可以了,对于统计完的table,首先执行k次push操作(这时候不用考虑其他),k次之后要判断最小堆顶的元素和准备进来的谁更大,只保留更大的就可以了,heapq中直接通过heappushpop()方法就可以一次实现插入当前元素并弹出最小元素
class Solution(object):
    def topKFrequent(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: List[int]
        """
        # 解法2
        table = {}
        for num in nums:
            if num in table: table[num] += 1
            else: table[num] = 1

        import heapq
        res = heapq.nlargest(k, table, key=lambda kk: table[kk])
        return res

    def otherSolution(self, nums, k):
        # 解法1
        table = {}
        for num in nums:
            if num in table: table[num] += 1
            else: table[num] = 1

        sorted_li = sorted(table.items(), key=lambda item: item[1], reverse=True)

        res = []
        for i in range(k):
            res.append(sorted_li[i][0])

        return res

        # 解法3
        table = {}
        for num in nums:
            if num in table: table[num] += 1
            else: table[num] = 1

        import heapq
        res = []
        for key, value in table.items():
            heapq.heappush(res, [value, key])
        for i in range(len(res)-k):
            heapq.heappop(res)

        return [item[1] for item in res]

        # 解法3 改进1
        table = {}
        for num in nums:
            if num in table: table[num] += 1
            else: table[num] = 1

        import heapq
        res = []
        for key, value in table.items():
            if len(res) < k:
                heapq.heappush(res, [value, key])
            else:
                heapq.heappushpop(res, [value, key])


        return [item[1] for item in res]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

doubleZ0108

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值