给你一个整数数组 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 个高频元素的集合是唯一的 `import heapq from collections import Counter
def solution(nums, k): freq_map = Counter(nums) min_heap = [] for num, freq in freq_map.items(): heapq.heappush(min_heap, (freq, num)) if len(min_heap) > k: heapq.heappop(min_heap) top_k = [item[1] for item in min_heap] top_k.sort() return ','.join(map(str, top_k))
if name == "main": print(solution([1,1,1,2,2,3], 2) == "1,2") print(solution([1], 1) == "1")`
为了解决这个问题,我们可以采用以下步骤和知识点: 算法思路:
- 统计频率:首先,我们需要遍历整个数组,统计每个数字出现的频率。这可以通过Python的字典来实现。
- 选择排序算法:由于要求时间复杂度优于O(n log n),我们不能使用常规的排序算法如快速排序或归并排序。相反,我们可以使用桶排序(Bucket Sort)或者堆排序(Heap Sort)来找到出现频率最高的k个元素。
- 构建结果字符串:找到频率最高的k个元素后,我们需要将它们按升序排列,并构建成字符串返回。 所用知识点:
- 字典(Hashmap):用于存储每个数字及其出现的频率。
- 桶排序:将频率作为键,数字作为值存储在桶中,然后按频率从高到低遍历桶。
- 堆排序:使用最小堆(Min Heap)来维护频率最高的k个元素。
- 字符串操作:使用字符串的
join方法来将数字列表转换为以逗号分隔的字符串。 时间复杂度分析:
- 统计频率的时间复杂度为O(n)。
- 桶排序的时间复杂度为O(n),因为每个元素只被放入一次桶中。
- 找到频率最高的k个元素的时间复杂度为O(n),在最坏的情况下,当所有元素频率相同时,需要遍历整个桶数组。
- 结果排序的时间复杂度为O(k log k),因为我们需要对频率最高的k个元素进行排序。
因此,总的时间复杂度为O(n + k log k),当k远小于n时,可以认为时间复杂度接近O(n),优于O(n log n)。