-
Top K Frequent Elements
给定一个非空整数数组,返回前K个最频繁的元素
输入:nums = [1, 1, 1, 2, 2, 3],k = 2
输出:[1, 2]
/* 思路:遇到这种top k的题目,一般都使用堆这种数据结构,因为堆排序每次只需要输出顶部,输出k次即可。 */ class Solution { public: vector<int> topKFrequent(vector<int>& nums, int k) { map<int, int> temp; priority_queue<pair<int, int>> heap; //priority_queue是大顶堆,按照first的值排序 vector<int> res; for(int i = 0; i < nums.size(); ++i) temp[nums[i]]++; map<int, int>::iterator it = temp.begin(); while(it != temp.end()) { heap.push(make_pair(it->second, it->first)); it++; } for(int i = 0; i < k; ++i) { res.push_back(heap.top().second); heap.pop(); } return res; } };
-
Top K Frequent Words
LeetCode 692
这道题和上道题的区别在于,上道题是按照数字出现的频率排序的,而这道题先按照频率排序,对于频率相同的情况,按照字母顺序排序。因此采用原始的大顶堆,结果就不正确,需要我们对priority_queue的比较函数进行重写。
struct cmp { bool operator()(pair<string, int> a, pair<string, int> b) { if(a.second == b.second) return a.first > b.first; else return a.second < b.second; } }; class Solution { public: vector<string> topKFrequent(vector<string>& words, int k) { map<string, int> temp; priority_queue<pair<string, int>, vector<pair<string, int>>, cmp> heap; //最后一个参数cmp为比较结构体,可以对其进行重写 vector<string> res; for(int i = 0; i < words.size(); ++i) temp[words[i]]++; map<string, int>::iterator it = temp.begin(); while(it != temp.end()) { heap.push(make_pair(it->first, it->second)); it++; } for(int i = 0; i < k; ++i) { res.push_back(heap.top().first); heap.pop(); } return res; } };
容器的使用
最新推荐文章于 2022-11-06 22:44:43 发布