查找热点数据问题| 豆包MarsCode AI刷题

29 阅读2分钟

问题描述

给你一个整数数组 nums 和一个整数 k,请你用一个字符串返回其中出现频率前 k 高的元素。请按升序排列。

你所设计算法的时间复杂度必须优于 O(n log n),其中 n 是数组大小。

输入

  • nums: 一个正整数数组
  • k: 一个整数

返回

返回一个包含 k 个元素的字符串,数字元素之间用逗号分隔。数字元素按升序排列,表示出现频率最高的 k 个元素。

参数限制

  • 1 <= nums[i] <= 10^4
  • 1 <= nums.length <= 10^5
  • k 的取值范围是 [1, 数组中不相同的元素的个数]
  • 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的

测试样例

样例1:

输入:nums = [1, 1, 1, 2, 2, 3], k = 2
输出:"1,2"
解释:元素 1 出现了 3 次,元素 2 出现了 2 次,元素 3 出现了 1 次。因此前两个高频元素是 1 和 2

样例2:

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

问题理解

我们需要找到数组 nums 中出现频率前 k 高的元素,并按升序排列。时间复杂度必须优于 O(n log n),其中 n 是数组的大小。

数据结构选择

  1. 哈希表(字典) :用于统计每个元素的出现频率。
  2. 最小堆(Min Heap) :用于维护前 k 个高频元素。

算法步骤

  1. 统计频率:使用哈希表统计每个元素的出现频率。
  2. 构建最小堆:遍历哈希表,将元素及其频率插入最小堆中。如果堆的大小超过 k,则弹出堆顶元素(即频率最小的元素)。
  3. 提取结果:从堆中提取元素,按升序排列。

关键步骤解释

  1. 统计频率:遍历数组 nums,使用字典 frequency 记录每个元素的出现次数。
  2. 构建最小堆:使用 heapq 模块的 heappush 和 heappop 方法维护一个大小为 k 的最小堆。堆中存储的是元素的频率和元素本身。
  3. 提取结果:从堆中依次弹出元素,并按升序排列。

提示

  • 你可以先尝试实现统计频率的部分。
  • 然后尝试使用 heapq 模块来维护最小堆。
  • 最后,按升序排列结果并返回。

def solution(nums, k): # 统计频率 frequency = {} for num in nums: if num in frequency: frequency[num] += 1 else: frequency[num] = 1

# 构建最小堆
import heapq
min_heap = []
for num, freq in frequency.items():
    heapq.heappush(min_heap, (freq, num))
    if len(min_heap) > k:
        heapq.heappop(min_heap)

# 提取结果
result = []
while min_heap:
    result.append(heapq.heappop(min_heap)[1])

# 按升序排列
result.sort()

return result

if name == "main": # You can add more test cases here print(solution([1,1,1,2,2,3], 2) == [1,2]) print(solution([1], 1) == [1])