Skip to main content

347.前K个高频元素

标签: hash-table, heap, sort

难度: Medium

通过率: 63.73%

原题链接: https://leetcode.com/problems/top-k-frequent-elements/description/

题目描述

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

解题思路

这道题要求我们找出出现频率最高的 k 个元素,可以利用计数和堆的性质来高效解决这个问题。具体步骤如下:

  1. 使用哈希表统计每个元素出现的次数。键是数组中的元素,值是其出现次数。
  2. 维护一个小顶堆,用于保存频率最高的 k 个元素。堆的大小最多为 k 。
  3. 遍历哈希表,将每个元素加入堆中。如果堆的大小超过 k ,则弹出堆顶元素,这样最终堆中保留的是频率最高的 k 个元素。
  4. 将堆中的元素收集起来,返回结果。

这种方法通过小顶堆的性质,达到将时间复杂度优化到 O(nlogk)O(n \log k) 的目的,其中 nn 是数组的长度。

代码实现

from collections import Counter
import heapq

def topKFrequent(nums, k):
# 统计每个数字出现的次数
count = Counter(nums)
# 构建小顶堆,比较频率
# 使用count.items()生成的键值对流入堆
return heapq.nlargest(k, count.keys(), key=count.get)

复杂度分析

时间复杂度:O(nlogk)O(n \log k),其中 nn 是数组的长度,因为我们利用了小顶堆来维护频率最高的 k 个元素。

空间复杂度:O(n)O(n),用于存储元素及其频率的哈希表和可能的堆的存储。