当前位置:   article > 正文

腾讯面试:前 K 个高频元素_给定一个非空的整数数组,返回其中出现频率前k高的元素

给定一个非空的整数数组,返回其中出现频率前k高的元素

题目: 

给定一个非空的整数数组,返回其中出现频率前 高的元素。

示例 1:

  1. 输入: nums = [1,1,1,2,2,3], k = 2
  2. 输出: [1,2]

示例 2:

  1. 输入: nums = [1], k = 1
  2. 输出: [1]
  1. class Solution {
  2. public:
  3. static bool cmp(pair<int, int>& m, pair<int, int>& n) {
  4. return m.second > n.second;
  5. }
  6. vector<int> topKFrequent(vector<int>& nums, int k) {
  7. unordered_map<int, int> occurrences;
  8. for (auto& v : nums) {
  9. occurrences[v]++;
  10. }
  11. // pair 的第一个元素代表数组的值,第二个元素代表了该值出现的次数
  12. priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(&cmp)> q(cmp);
  13. for (auto& [num, count] : occurrences) {
  14. if (q.size() == k) {
  15. if (q.top().second < count) {
  16. q.pop();
  17. q.emplace(num, count);
  18. }
  19. } else {
  20. q.emplace(num, count);
  21. }
  22. }
  23. vector<int> ret;
  24. while (!q.empty()) {
  25. ret.emplace_back(q.top().first);
  26. q.pop();
  27. }
  28. return ret;
  29. }
  30. };

利用小顶堆:

如果堆的元素个数小于 kk,就可以直接插入堆中。
如果堆的元素个数等于 kk,则检查堆顶与当前出现次数的大小。如果堆顶更大,说明至少有 kk 个数字的出现次数比当前值大,故舍弃当前值;否则,就弹出堆顶,并将当前值插入堆中。

 

参考地址:https://leetcode-cn.com/problems/top-k-frequent-elements/solution/qian-k-ge-gao-pin-yuan-su-by-leetcode-solution/
 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/72755
推荐阅读
相关标签
  

闽ICP备14008679号