官方任务
给定整数数组 nums 与整数 k,返回出现频率最高的 k 个元素。答案可以按任意顺序返回。
输出:[1,2]
输出:[1]
Unit 07 · LeetCode #215
大小K最小堆仍然有效,但当全部数组已在内存中时,还可以通过Quickselect分区:把一个枢轴放到最终排序位置,只继续处理包含目标下标的一侧。
给定整数数组 nums 和整数 k,返回数组按降序排序后的第 k 大元素。它是排序位置上的第k大,不是第k个不同元素。
题目进一步询问:能否在不完整排序数组的情况下完成?
1 ≤ k ≤ nums.length ≤ 10⁵;-10⁴ ≤ nums[i] ≤ 10⁴;将第k大转换为升序目标下标 target=n-k,使用Quickselect反复分区。平均时间 O(n),最坏 O(n²);迭代原地分区的额外空间为 O(1)。大小K最小堆仍提供稳定的 O(n log k) 方案。
升序数组中第k大位于下标 n-k。示例n=6、k=2,因此目标是升序index 4。
选择pivot,使其左侧元素≤pivot、右侧元素>pivot;pivot到达最终排序位置。
分区后不递归处理两边,只继续处理包含目标排名的一侧,因此平均总工作量是线性的。
固定劣质pivot可能连续只排除一个元素;随机选择可以降低反复出现极端分区的风险。
第2大在升序排列中对应index n-k=4。
每次partition后,pivot已经位于完整升序排序中的最终下标;目标只可能在pivot处或其中一侧。
我们只需要一个排名,不需要两侧内部有序。pivot下标已经提供足够的排名方向信息。
排序最简单;大小K堆适合k较小且需要稳定复杂度;Quickselect平均最快并可原地执行,但最坏分区会退化。
目标下标转换、partition范围以及分区后的方向判断必须保持一致。
k−1是降序下标;当前partition按升序放置pivot,因此目标必须是 n-k。
两侧都处理会退回QuickSort式工作。选择问题只需继续包含target的一侧。
固定末尾pivot遇到有序数组时可能每轮只减少一个元素,最坏达到O(n²)。
重复值分别占据排序位置;Quickselect不需要去重,也不要求pivot值唯一。
[left, store) 已经全部不大于 pivot;store 指向下一个可放入左分区的位置。本题不是直接比较原始数值,而是先把数组压缩成 元素 → 出现频率 的候选集合,再维护频率最高的 K 个元素。返回顺序可以任意。
给定整数数组 nums 与整数 k,返回出现频率最高的 k 个元素。答案可以按任意顺序返回。
1 ≤ nums.length ≤ 10⁵-10⁴ ≤ nums[i] ≤ 10⁴1 ≤ k ≤ 不同元素数量O(n log n)示例中元素 1、2、3 的频率分别是多少?
返回结果必须按频率从高到低排序吗?
比较标准是数值大小;Quickselect 直接在原数组中定位目标排名。
先用哈希表压缩重复值,再按 frequency 维护 Top-K。
点击下列步骤,将它们加入执行序列。
不要求背完整代码,只要求把“计数 → 候选 → 容量约束 → 提取结果”四个职责写准确。
nums=[1,1,1,2,2,3], k=2
离线第K大可以选择完整排序、大小K堆或Quickselect。Quickselect的关键不是让数组完全有序,而是让pivot获得确定排名,并只继续处理包含目标下标的一侧。