C++ 查找前K个频繁词
我正在尝试解决Leetcode网站上的一个问题- 给定一个非空的单词列表,返回k个最频繁的元素。C++ 查找前K个频繁词,c++,algorithm,C++,Algorithm,我正在尝试解决Leetcode网站上的一个问题- 给定一个非空的单词列表,返回k个最频繁的元素。 你的答案应该按频率从高到低排序。如果两个单词的频率相同,那么字母顺序较低的单词排在第一位。例如:如果输入是:[“the”,“day”,“is”,“sunny”,“the”,“the”,“the”,“the”,“sunny”,“is”,“is”],k=4,那么输出应该是:[“the”,“is”,“sunny”,“day”] 其中一个经过投票表决的解决方案如下所示: class Solution { p
你的答案应该按频率从高到低排序。如果两个单词的频率相同,那么字母顺序较低的单词排在第一位。例如:如果输入是:[“the”,“day”,“is”,“sunny”,“the”,“the”,“the”,“the”,“sunny”,“is”,“is”],k=4,那么输出应该是:[“the”,“is”,“sunny”,“day”] 其中一个经过投票表决的解决方案如下所示:
class Solution {
public:
vector<string> topKFrequent(vector<string>& words, int k) {
unordered_map<string,int> dict;
for(const string& s:words) dict[s]++;
priority_queue<pair<string,int>, vector<pair<string,int>>, Comp> pq;
for(const auto& pa:dict) {
pq.push(pa);
if(pq.size()>k) pq.pop();
}
vector<string> result;
while(!pq.empty()) {
result.push_back(pq.top().first);
pq.pop();
}
reverse(result.begin(),result.end());
return result;
}
private:
struct Comp {
Comp() {}
~Comp() {}
bool operator()(const pair<string,int>& a, const pair<string,int>& b) {
return a.second>b.second || (a.second==b.second && a.first<b.first);
}
};
};
类解决方案{
公众:
向量topKFrequent(向量和单词,int k){
无序的地图记录;
对于(常量字符串&s:words)dict[s]++;
优先级队列pq;
用于(const auto&pa:dict){
电能质量推力(pa);
如果(pq.size()>k)pq.pop();
}
矢量结果;
而(!pq.empty()){
结果。向后推(pq.top()。首先);
pq.pop();
}
反向(result.begin(),result.end());
返回结果;
}
私人:
结构组件{
Comp(){}
~Comp(){}
布尔运算符()(常数对&a、常数对&b){
返回a.second>b.second | |(a.second==b.second&&a.firstk
,wepop()
-这不正确吗?因为在这种情况下,我们正在丢失最高频率的元素?我认为是这样,因为根据比较器,频率较高的元素(或在频率相同的情况下,按字母顺序较小的元素)在优先级队列的顶部插入
对
)pq.push(pa);
的情况下,pa
的具体类型是什么?我想知道,因为pq
包含向量
,但是dict
只包含字符串
(映射到它们在int
中的频率)。如何使用auto
自动将字符串
键映射到其int
频率,以便插入优先级队列pa
的类型是在unordered\u map::value\u type
中指定的类型,即std::pair
。
实际上,无序映射::值类型
的每个元素都是std::pair
的类型定义,并且由于优先级队列
存储std::pair
,因此不会出现奇怪的情况希望这能有所帮助。只是一个旁注:这不是
std::pair
,而是std::pair
;>关于(1)-返回语句是returna.second>b.second | |(a.second==b.second&&a.firstOk,那么你说的last
意思是a
(因为它比b
)?好,明白了。谢谢!)