问题描述
给你一个整数数组 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 个高频元素的集合是唯一的
问题分析
我们需要找到一个整数数组 nums 中出现频率最高的 k 个元素,并将这些元素按升序排列后以字符串形式返回。时间复杂度必须优于 O(n log n),其中 n 是数组的大小。
步骤
-
统计频率:
- 使用一个哈希表(
HashMap)来统计数组中每个元素的出现频率。 - 遍历数组
nums,对于每个元素,更新其在哈希表中的计数。
- 使用一个哈希表(
-
维护频率最高的 k 个元素:
- 使用一个最小堆(
PriorityQueue)来维护频率最高的k个元素。 - 遍历哈希表中的所有元素,将元素加入最小堆。如果堆的大小超过
k,则移除堆顶元素(即频率最小的元素)。
- 使用一个最小堆(
-
构建结果字符串:
- 从最小堆中取出所有元素,并按升序排列。
- 将这些元素按要求格式化为字符串,元素之间用逗号分隔。
算法复杂度
-
时间复杂度:
- 统计频率:
O(n) - 维护最小堆:
O(n log k) - 构建结果字符串:
O(k log k) - 总时间复杂度:
O(n log k),满足题目要求。
- 统计频率:
-
空间复杂度:
- 哈希表:
O(n) - 最小堆:
O(k) - 总空间复杂度:
O(n)
- 哈希表:
通过以上步骤和数据结构的选择,我们可以高效地解决这个问题。