692. 前K个高频单词
692. 前K个高频单词
给一非空的单词列表,返回前 k 个出现次数最多的单词。
返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,按字母顺序排序。
示例 1:
输入: ["i", "love", "leetcode", "i", "love", "coding"], k = 2
输出: ["i", "love"]
解析: "i" 和 "love" 为出现次数最多的两个单词,均为2次。
注意,按字母顺序 "i" 在 "love" 之前。
优先队列+哈希表
- 经典优先队列问题,找出前K个出现次数最多的单词,且当单词一样多时排列字母顺序。
- 难点在于如何自定义优先队列的比较类型
(cmp)。死记硬背。。。 auto cmp = [&](const char &c1, const char &c2) {return array[c1] > array[c2]; };priority_queue<char, vector<char>, decltype(cmp)> myqueue{cmp};
class Solution {
public:
vector<string> topKFrequent(vector<string>& words, int k) {
map<string, int> mymap;
for(auto word: words)
mymap[word]++;
auto cmp = [&](const string &s1, const string &s2){
return (mymap[s1] < mymap[s2]) || (mymap[s1] == mymap[s2] && s1 >= s2) ;
};
priority_queue<string, vector<string>, decltype(cmp)> myqueue{cmp};
for(auto iter = mymap.begin(); iter != mymap.end();++iter)
myqueue.push(iter -> first);
vector<string> ans;
for(int i = 0; i < k; ++i){
string tmp = myqueue.top();
myqueue.pop();
ans.push_back(tmp);
}
return ans;
}
};

浙公网安备 33010602011771号