class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
}
};
剑指 Offer II 060. 出现频率最高的 k 个数字
给定一个整数数组 nums
和一个整数 k
,请返回其中出现频率前 k
高的元素。可以按 任意顺序 返回答案。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2]
示例 2:
输入: nums = [1], k = 1 输出: [1]
提示:
1 <= nums.length <= 105
k
的取值范围是 [1, 数组中不相同的元素的个数]
k
个高频元素的集合是唯一的
进阶:所设计算法的时间复杂度 必须 优于 O(n log n)
,其中 n
是数组大小。
注意:本题与主站 347 题相同:https://leetcode.cn/problems/top-k-frequent-elements/
原站题解
golang 解法, 执行用时: 8 ms, 内存消耗: 5.7 MB, 提交时间: 2022-11-20 17:23:23
// 基于快排 func topKFrequent(nums []int, k int) []int { occurrences := map[int]int{} for _, num := range nums { occurrences[num]++ } values := [][]int{} for key, value := range occurrences { values = append(values, []int{key, value}) } ret := make([]int, k) qsort(values, 0, len(values) - 1, ret, 0, k) return ret } func qsort(values [][]int, start, end int, ret []int, retIndex, k int) { rand.Seed(time.Now().UnixNano()) picked := rand.Int() % (end - start + 1) + start; values[picked], values[start] = values[start], values[picked] pivot := values[start][1] index := start for i := start + 1; i <= end; i++ { if values[i][1] >= pivot { values[index + 1], values[i] = values[i], values[index + 1] index++ } } values[start], values[index] = values[index], values[start] if k <= index - start { qsort(values, start, index - 1, ret, retIndex, k) } else { for i := start; i <= index; i++ { ret[retIndex] = values[i][0] retIndex++ } if k > index - start + 1 { qsort(values, index + 1, end, ret, retIndex, k - (index - start + 1)) } } }
golang 解法, 执行用时: 8 ms, 内存消耗: 5.3 MB, 提交时间: 2022-11-20 17:22:59
// 基于堆排序 func topKFrequent(nums []int, k int) []int { occurrences := map[int]int{} for _, num := range nums { occurrences[num]++ } h := &IHeap{} heap.Init(h) for key, value := range occurrences { heap.Push(h, [2]int{key, value}) if h.Len() > k { heap.Pop(h) } } ret := make([]int, k) for i := 0; i < k; i++ { ret[k - i - 1] = heap.Pop(h).([2]int)[0] } return ret } type IHeap [][2]int func (h IHeap) Len() int { return len(h) } func (h IHeap) Less(i, j int) bool { return h[i][1] < h[j][1] } func (h IHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] } func (h *IHeap) Push(x interface{}) { *h = append(*h, x.([2]int)) } func (h *IHeap) Pop() interface{} { old := *h n := len(old) x := old[n-1] *h = old[0 : n-1] return x }
python3 解法, 执行用时: 36 ms, 内存消耗: 17.8 MB, 提交时间: 2022-11-20 17:22:08
class Solution: def topKFrequent(self, nums: List[int], k: int) -> List[int]: c = Counter(nums) res = sorted(c, key=lambda num:-c[num]) return res[:k]