leetcode_347 前 K 个高频元素

124 阅读2分钟

要求

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

示例 1:

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

示例 2:

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

核心代码

class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        from collections import Counter
        return [digit for digit,freq in Counter(nums).most_common(k)]

另一解法(重点)

class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        from collections import Counter
        from heapq import heapify,heappush,heappop
        dic = Counter(nums)
        heap = []
        heapify(heap)
        for key,val in dic.items():
            heappush(heap,(-val,key))
        res = []
        while k:
            top = heappop(heap)
            res.append(top[1])
            k -= 1
        return res

第三种解法

class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        from collections import Counter
        from heapq import heapify,heappush,heappop
        dic = Counter(nums)
        heap = []
        heapify(heap)
        for key,val in dic.items():
            if len(heap) <k:
                heappush(heap,(val,key))
            else:
                if heap[0][0] < val:
                    heappush(heap,(val,key))
                    heappop(heap)
        res = []
        while heap:
            top = heappop(heap)
            res.append(top[1])
        return res

image.png

重点题目

解题思路:

第一种解法:通过调库的方式Counter的most_common方法,参数k,统计出来频率最高的k个元素,返回输出。第二种解法(重点):题目问前K个高频,就是求前k个出现次数最大的元素。经典的TOP k问题一般都是用,此题同理。先统计一下每个元素出现的频率,然后把这些频率建最大堆,保证堆顶元素出现频率最大,然后pop k次 堆顶,即可找到前k个出现次数最大的元素。第三种解法(重点):其实第三种解法是在第二种解法的基础上进行的优化,我们要选取的是前k个元素,所以我们不需要将所有元素都进行堆的构建,当我们的堆的数量小于k,直接添加元素,当我们的堆的数量超过k,我们需要判断元素是不是要加入到堆中,因为构建的是最小堆,所以元素只有大于堆顶元素才能将其加入到堆中,并且将顶元素弹出,维持堆中一共k个元素,构建完成,最后遍历将堆中所有元素输出即可。