LeetCode: 前K个高频元素

528 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第32天,点击查看活动详情

前K个高频元素

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

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

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

  • 提示: 你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。 你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。 你可以按任意顺序返回答案。

  • 来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/to…

解法

题解:leetcode-cn.com/problems/to…

个人思路:

  • 字典排序: 时间复杂度为o(nlgn) 空间复杂度为o(n)
  • 优先队列:
  • 调包: collections中的Counter
class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        if nums is None or len(nums) == 1:
            return nums
        # 字典排序
        '''
        res = {}
        for i in nums:
            if i in res:
                res[i] += 1
            else:
                res[i] = 1
        # sort_res = sorted(res.items(), key=lambda x: x[1], reverse=True)
        # return [i[0] for i in sort_res[:k]]
        '''
        # 优先队列
        '''
        import heapq
        heap = []
        for kk, v in res.items():
            heapq.heappush(heap, (-v, kk))
        res = []
        for _ in range(k):
            res.append(heapq.heappop(heap)[1])        
        return res
        '''

        # 使用包 collections
        from collections import Counter
        counter=collections.Counter(nums)
        res = counter.most_common(k)
        return [i[0] for i in res]