LeetCode-Python-347. 前K个高频元素

本文介绍了解决寻找数组中出现频率最高的前k个元素问题的三种不同算法思路。第一种使用Python标准库快速实现;第二种采用最大堆优化性能;第三种进一步优化为最小堆,达到更优的时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个非空的整数数组,返回其中出现频率前 高的元素。

示例 1:

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

示例 2:

输入: nums = [1], k = 1
输出: [1]

说明:

  • 你可以假设给定的 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。
  • 你的算法的时间复杂度必须优于 O(n log n) , 是数组的大小。

第一种思路:

调库

class Solution(object):
    def topKFrequent(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: List[int]
        """
        return [digit for digit, fre in collections.Counter(nums).most_common(k)]

第二种思路:

题目问前K个高频,就是求前k个出现次数最大的元素。

经典的TOP k问题一般都是用heap,此题同理。

比较朴素的方法是:

先统计一下每个元素出现的频率,然后把这些频率建最大堆,保证堆顶元素出现频率最大,

然后pop k次 堆顶,即可找到前k个出现次数最大的元素。

class Solution(object):
    def topKFrequent(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: List[int]
        """
        
        from collections import Counter
        from heapq import *
        # time: O(nlogn)
        # space: O(n)
        dic = Counter(nums) # O(n)
        
        heap = []
        heapify(heap)
        for key, val in dic.items():
            heappush(heap, (-val, key)) # O(nlogn)
            
        # print heap
        res = []
        while k: # O(klogn)
            top = heappop(heap)
            # print top
            res.append(top[1])
            k -= 1
        return res

第三种思路:

优化一下,实际上并不需要把所有元素都放进堆里,因为我们找到是前k个,所以堆的大小为k其实就够用了,

在这种情况下, 建立并维护一个size 为k 的最小堆,使得堆顶元素的出现频率是堆中所有元素出现频率中最小的,

遍历字典,如果一个元素当前出现频率 比 堆顶元素的出现频率都要小,则说明它必不可能是 TOP k 元素;

否则,将当前元素插入堆中,并pop一次,以保证最小堆的size始终为k。

class Solution(object):
    def topKFrequent(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: List[int]
        """
        
        from collections import Counter
        from heapq import *
        
        # time: O(nlogk)
        # space: O(n)
        dic = Counter(nums) # O(n)
        
        heap = []
        heapify(heap)
        
        for key, val in dic.items(): # O(nlogk)
            if len(heap) < k:
                heappush(heap, (val, key))
            else:
                if heap[0][0] < val:
                    heappush(heap, (val, key))
                    heappop(heap)
            
        # print heap
        res = []
        while heap: # O(klogk)
            top = heappop(heap)
            res.append(top[1])
        return res

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值