Leetcode_347_Top K Frequent Elements

来源:互联网 发布:浅野菌子淘宝 编辑:程序博客网 时间:2024/06/04 20:00

这一题主要是让我们找出前k个最频繁出现的数字。比较简单的想法是先统计一遍所有数字出现的频率,然后根据频率来降序排列,最后输出前k个。说起来还挺容易实现的,但可能还是STL的map,vector用的不够熟练,因此也处理了好长时间T T另外本次还会讲到vector的sort函数,我们可以自定义一个规则来实现这个sort函数。

class Solution {public:static bool com_by_values(pair<int,int> p1,pair<int,int> p2 ){if(p1.second > p2.second)return 1;elsereturn 0;}vector<int> topKFrequent(vector<int>& nums, int k) {     map<int,int>a; vector<int>result;     int count = 0; for(int i=0;i<nums.size();i++){ a[nums[i]]++; } vector<pair<int,int> > num(a.begin(),a.end()); sort(num.begin(),num.end(),com_by_values);for(int i=0;i<k;i++){//cout<<num[i].first<<endl;result.push_back(num[i].first);}return result;}};
bool com_by_values(pair<int,int>p1,pair<int,int>p2):

自定义的规则,传入的参数是我需要比较的两个值的类型,因为用在vector<pair<int,int> >num的排序中,也就是说两两比较的时候是两个对在进行比较。


什么要用vector<pair<int,int> >

之前选择用map,不能使用sort函数,还要自己写一个函数并且不能进行顺序的排列;另外pair<int, int> 存了一对一对的数,那么不会进行覆盖,之前用map选择将second的值作为key,将first的值作为value,这样导致如果出现同样次数的数,后面的数字会将前面的数字进行覆盖,导致结果错误。

 

vector<pair<int,int> > num(a.begin(),a.end());

这样的构造vector的方式还是第一次见,很是方便,传入起始指针与结束指针,成功构造vector函数。还有一点需要注意的是vector没有<int,int>这样的类型构造。


选择STL容器的好处:

如果是数组的话你还要考虑开多大的数组,可能会出现runtime error

有一些已经写好的现成函数可以调用,比如vector的sort

另外STL容器支持key-value的形式,我们可以根据自己的需求来制定对应的关系

STL容器可用指针操作

0 0
原创粉丝点击