赞
踩
题目:
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
示例 1:
- 输入: nums = [1,1,1,2,2,3], k = 2
- 输出: [1,2]
示例 2:
- 输入: nums = [1], k = 1
- 输出: [1]
- class Solution {
- public:
- static bool cmp(pair<int, int>& m, pair<int, int>& n) {
- return m.second > n.second;
- }
-
- vector<int> topKFrequent(vector<int>& nums, int k) {
- unordered_map<int, int> occurrences;
- for (auto& v : nums) {
- occurrences[v]++;
- }
-
- // pair 的第一个元素代表数组的值,第二个元素代表了该值出现的次数
- priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(&cmp)> q(cmp);
- for (auto& [num, count] : occurrences) {
- if (q.size() == k) {
- if (q.top().second < count) {
- q.pop();
- q.emplace(num, count);
- }
- } else {
- q.emplace(num, count);
- }
- }
- vector<int> ret;
- while (!q.empty()) {
- ret.emplace_back(q.top().first);
- q.pop();
- }
- return ret;
- }
- };
利用小顶堆:
如果堆的元素个数小于 kk,就可以直接插入堆中。
如果堆的元素个数等于 kk,则检查堆顶与当前出现次数的大小。如果堆顶更大,说明至少有 kk 个数字的出现次数比当前值大,故舍弃当前值;否则,就弹出堆顶,并将当前值插入堆中。
参考地址:https://leetcode-cn.com/problems/top-k-frequent-elements/solution/qian-k-ge-gao-pin-yuan-su-by-leetcode-solution/
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。