这道题是典型高频题,DoorDash 面试里经常用来观察候选人对数据结构的掌控,以及在有限时间内如何快速收敛到最优解。
英文原题
Top K Frequent Elements
Given an integer array nums and an integer k, return the k most frequent elements. You may return the answer in any order.
Example:
- Given [1,1,1,2,2,3] and k = 2 → [1,2]
- Given [1,2,3,2,3] and k = 2 → [2,3]
- Given [1,2,3,4] and k = 2 → [1,2]
给你一个整数数组,找出出现次数最多的前 k 个数字,顺序无要求。
面试官关注点很直接:你怎么在一遍扫描后快速筛出“最常出现的那几个”。
候选人拿到题目后第一反应是确认边界:
“结果顺序不重要吗?”
“k 一定小于等于数组中不同元素个数吗?”
面试官确认后,候选人很自然开始思考。
第一步是频率统计,用一个 HashMap 存每个数字出现次数。这一步没有悬念,时间复杂度 O(n)。
接下来是核心部分:如何拿到 top k。
候选人一开始提到排序,把所有元素按频率排序再取前 k。面试官没有打断,只是问了一句复杂度。候选人自己意识到这是 O(n log n),开始往更优方向调整。
思路切换到堆。
这里的关键点出现了:
不是用大顶堆,而是用小顶堆,容量限制为 k。
整个过程是这样推进的:
- 遍历 frequency map
- 每个元素丢进堆
- 堆大小超过 k 时,弹出最小频率
这样堆里始终保留的是当前最“值钱”的 k 个元素。
候选人当时的代码思路如下(整理自你给的实现):
他在讲的时候有一句很加分:“heap size is only k, so log factor is small”。面试官点头。
很多人卡在面试,不是不会做题,是不知道怎么“在面试里把题做对”。
真实面试里,每一句解释、每一个停顿、每一次修正思路,都会影响评价。
csoahelp 做的事情很简单:
在你面试的时候,实时帮你把思路补完整,把表达变清晰,把答案稳住。
我们也有代面试,面试辅助,OA代写等服务助您早日上岸~

