青训营X豆包MarsCode 技术训练营第三课 | 豆包MarsCode AI刷题

42 阅读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 个高频元素的集合是唯一的 `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")`

为了解决这个问题,我们可以采用以下步骤和知识点: 算法思路:

  1. 统计频率:首先,我们需要遍历整个数组,统计每个数字出现的频率。这可以通过Python的字典来实现。
  2. 选择排序算法:由于要求时间复杂度优于O(n log n),我们不能使用常规的排序算法如快速排序或归并排序。相反,我们可以使用桶排序(Bucket Sort)或者堆排序(Heap Sort)来找到出现频率最高的k个元素。
  3. 构建结果字符串:找到频率最高的k个元素后,我们需要将它们按升序排列,并构建成字符串返回。 所用知识点:
  4. 字典(Hashmap):用于存储每个数字及其出现的频率。
  5. 桶排序:将频率作为键,数字作为值存储在桶中,然后按频率从高到低遍历桶。
  6. 堆排序:使用最小堆(Min Heap)来维护频率最高的k个元素。
  7. 字符串操作:使用字符串的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)。