1.1我的想法
先用unordered_map统计每个数字出现的频率,以key作为数字,以value作为频率,对于value(频率)进行排序。最后将value相对应的数字,也就是key放入最终达到答案里面。
这里涉及到两个问题
1)是对于value进行排序,而map本身会对key进行排序,用sort也能对map的value进行排序
2)map不提供从value到key的查找

1.2 官方解答

class Solution {public:static bool cmp(pair<int, int>& m, pair<int, int>& n) {return m.second > n.second;}//不明白为什么返回值要加上staticstruct cmp{bool operator()(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) {//遍历容器的时候这里面加上引用是什么含义//for(auto &a:b),循环体中修改a,b中对应内容也会修改//for(auto a:b),循环体中修改a,b中内容不受影响
//for(const auto &a:b),a不可修改,用于只读取b中内容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;}
};作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/top-k-frequent-elements/solution/qian-k-ge-gao-pin-yuan-su-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

我的最终的解法
在设定优先队列的优先级的时候使用了functor.

class Solution{public:struct cmp{bool operator()(pair<int,int>& m,pair<int,int>& n){return m.second > n.second;}};//class 里面还可以包含class吗?//可以此时外界的class对于里面的class相当于一个namespace.vector<int> topKFrequent(vector<int>& nums,int k){unordered_map<int,int> occurrences;for(auto& i:nums){occurrences[i]++;}priority_queue<pair<int,int>,vector<pair<int,int>>,cmp> q;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.push_back(q.top().first);q.pop();}return ret;}
};

最终学会的写法,较为简洁

class Solution {public:struct cmp{bool operator()(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> myMap;for(auto& i:nums){myMap[i]++;}priority_queue<pair<int,int>,vector<pair<int,int>>,cmp> que;for(auto& p:myMap){que.push(p);if(que.size() > k)que.pop();}vector<int> ret;while(!que.empty()){ret.push_back(que.top().first);que.pop();}return ret;}
};

1.4学到了什么
1)map容器第三个参数可放置一个比较函数,根据比较函数的规则对key进行排序

template < class Key, class T, class Compare = less<Key>,class Allocator = allocator<pair<const Key,T> > > class map;

2)priority_queue优先队列
priority_queue<Type, Container, Functional>,其中Type 为数据类型,Container为保存数据的容器,Functional 为元素比较方式。
Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector。
对于优先队列的优先级的设定不是很明白

2021-06-03Leetcode347.前K个高频元素相关推荐

  1. 前K个高频元素(top k)(TX)

    思路 这道题目主要涉及到如下三块内容: 1.要统计元素出现频率 2.对频率排序 3.找出前K个高频元素 首先统计元素出现的频率,这一类的问题可以使用map来进行统计. 然后是对频率进行排序,这里我们可 ...

  2. 统计list里面相同元素个数_LeetCode 第 347 号问题:前 K 个高频元素

    本文首发于公众号「五分钟学算法」,是图解 LeetCode 系列文章之一. 个人网站:https://www.cxyxiaowu.com 今天分享的题目来源于 LeetCode 上第 347 号问题: ...

  3. 215.数组中的第K个最大元素/347. 前 K 个高频元素

    2020-05-25 1.题目描述 数组中的第K个最大元素 2.题解 1.使用冒泡排序 2.使用快速排序 3.优先队列(内部是用堆来实现的) 3.代码 class Solution { public: ...

  4. 【LeetCode】【HOT】347. 前 K 个高频元素(哈希表+优先队列)

    [LeetCode][HOT]347. 前 K 个高频元素 文章目录 [LeetCode][HOT]347. 前 K 个高频元素 package hot;import java.util.Arrays ...

  5. 2021-11-12:前 K 个高频元素。给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。提示:1 <= nums.length <=

    2021-11-12:前 K 个高频元素.给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素.你可以按 任意顺序 返回答案.提示:1 <= nums.length ...

  6. 前K个高频元素[小根堆和大根堆的使用]

    小根堆 前言 一.前K个高频元素 二.小根堆&大根堆 1.O(KlogN)大根堆 2.O(NlogK)小根堆 总结 参考文献 前言 当题目需要有序性时,果断排序,可二分快速寻找答案,或是利用有 ...

  7. Leetcode题347、前K个高频元素(Python题解)Amazon面试题

    问题: 题目来源:力扣(LeetCode) leetcode347.前K个高频元素 难度:中等 分析: 本题解提供四种方法,分别是python的Counter技巧.堆.桶排序.快排. 对于python ...

  8. LeetCode——347. 前 K 个高频元素【最小堆实现】

    LeetCode--347. 前 K 个高频元素[最小堆实现] 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素.你可以按 任意顺序 返回答案. 示例1: 输入: n ...

  9. 力扣347 前 K 个高频元素 -- JS

    347. 前 K 个高频元素 - 力扣(LeetCode) (leetcode-cn.com) 一:使用对象进行解题,对象的属性为给定数组的元素,属性值为给定数组元素出现的次数: 二:把对象转成数组, ...

  10. 力扣347:前k个高频元素---leetcode347:Top K Frequent Elements

    leetcode347题目链接:https://leetcode.cn/problems/top-k-frequent-elements 目录 一.题目描述 二.思路 1.什么是优先级队列呢? 2.什 ...

最新文章

  1. 对 Thinking in java 4th Edition I/O DirList.java的疑问
  2. mysql 获取当前整点_Oracle 生成未来三天的整点时间(步骤详解)
  3. SAP PP 成品工单批次号跟所消耗的半成品批次号一致
  4. 【分享预告】细数GAN和图像分类的前世今生
  5. 选32位 64位 oracle,32位PLSQL配置为64位的Oracle和64位系统
  6. HYSBZ - 2342 双倍回文(回文自动机)
  7. git pull 覆盖本地_SVN与Git比较的优缺点差异
  8. *【CodeForces - 799C】Fountains (线段树 或 树状数组,类似二元组问题)
  9. 计算机无法上网修复工具,网络异常修复工具,连接后无法上网修复方式
  10. 如何配置程序集的版本策略
  11. UML图各类符号含义
  12. vue: 无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\vue.ps1,因为在此系统上`禁止运行脚本`。(powershell运行策略设置)
  13. 【Python基础教程】while循环用法详解
  14. 南向接口 YANG 文件定义规范
  15. pascal方格稿纸
  16. 俄罗斯黑产界淘宝运营人被美国抓捕,靠收租进账千万美元
  17. Premiere Pro之字幕添加(三)
  18. 用图片制作radio单选按钮
  19. 关于n%k=n-(n/k)*K
  20. 折半查找法(二分法)流程图

热门文章

  1. [文档].Actel – Actel HDL Coding Style Guide
  2. Snow Footprints
  3. CodeForces 298A Snow Footprints
  4. 红外测距传感器GP2D12与STM32单片机程序,滤波算法
  5. Gitlab创建issue
  6. 64位php 套装 apache,WIN764位下 PHP7.3 apache2.4 安装配置
  7. Unity-Slider调节音量大小功能
  8. Arduino-光控灯的实现
  9. 单片机人体感应灯c语言,单片机光控人体感应灯案例.doc
  10. 阿里云域名购买、认证、解析 腾讯企业邮箱注册、解析