返回

纵览347题:前K个高频元素的奥妙

前端

高频元素的定义

在计算机科学领域,“高频元素”是指在给定数据集或序列中出现次数最多的元素。高频元素分析是一种常见的数据挖掘技术,广泛应用于各种场景,如:

  • 文本分析:识别文本中最常见的单词或短语,以便进行关键词提取、主题建模和情感分析。
  • 网络分析:确定网站或在线社区中最活跃或最受欢迎的用户,以进行用户行为分析和个性化推荐。
  • 金融分析:发现股票市场或外汇市场中交易最频繁的资产,以进行投资决策和风险管理。

LeetCode 347题概述

LeetCode 347题给定一个整数数组 nums 和一个整数 k ,要求我们找出其中出现频率前 k 高的元素。挑战在于,我们并不知道最终答案是什么,而且我们不能对原数组进行任何修改,即只能遍历原数组一次来完成任务。

哈希表

哈希表是一种重要的数据结构,常用于快速地查找和插入数据。哈希表的基本原理是将数据项映射到一个哈希值,然后将数据项存储在哈希值对应的存储空间中。当需要查找某个数据项时,只需要计算出它的哈希值,然后直接访问哈希值对应的存储空间即可。哈希表是一种非常高效的数据结构,它的查找和插入时间复杂度都为 O(1)。

优先队列

优先队列是一种特殊的队列,它根据元素的优先级进行排序。优先队列中的元素总是按优先级从高到低排列。当我们需要从优先队列中取出一个元素时,总是会取出优先级最高的那个元素。优先队列通常使用堆数据结构来实现。堆是一种完全二叉树,其中每个节点的键值都大于或等于其子节点的键值。优先队列的查找和插入时间复杂度都是 O(log n),其中 n 是优先队列中的元素个数。

解决LeetCode 347题

我们可以使用哈希表来统计每个元素出现的次数,然后使用优先队列来找出出现频率前 k 高的元素。具体步骤如下:

  1. 使用哈希表统计每个元素出现的次数。
  2. 将哈希表中的元素及其对应的出现次数插入优先队列中。
  3. 从优先队列中取出前 k 个元素,即出现频率前 k 高的元素。

示例代码

def top_k_frequent(nums, k):
    # 使用哈希表统计每个元素出现的次数
    freq = {}
    for num in nums:
        if num not in freq:
            freq[num] = 0
        freq[num] += 1

    # 将哈希表中的元素及其对应的出现次数插入优先队列中
    pq = []
    for num, count in freq.items():
        pq.append((count, num))
    pq.sort(reverse=True)

    # 从优先队列中取出前k个元素,即出现频率前k高的元素
    top_k = []
    for i in range(k):
        top_k.append(pq[i][1])

    return top_k


nums = [1, 1, 1, 2, 2, 3]
k = 2
print(top_k_frequent(nums, k))

输出结果:

[1, 2]