C ++中排名前K的常用词
假设我们有一个非空的单词列表;我们必须找到k个最频繁的元素。我们的答案应该按照频率从高到低的顺序排序。当两个单词具有相同的频率时,则将首先按字母顺序排列较低的单词。因此,如果数组像['the','sky','is','blue','the','weather','is','comfortable']一样,则最常用的单词是[“is”,“the”,“blue”]
为了解决这个问题,我们将遵循以下步骤-
定义一张称为m的映射
创建一个优先级队列v
对于i:=0到n,其中n是单词数组的大小,然后将m[words[i]]加1
对于映射中的每个元素e
如果v<k的大小,则将e插入v
否则,如果v.top的值<e的值,则从v中删除top元素并将e插入v。
否则,如果v.top的值为=e的值并且v.top的键为>e的键,则从v中删除top元素,将e插入v
定义一个称为res的数组
当v不为空时,
temp:=v的顶部
从v删除top
将临时键插入res数组
反转res数组
返回资源
例子(C++)
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h> using namespace std; void print_vector(vector<auto> v){ cout << "["; for(int i = 0; i<v.size(); i++){ cout << v[i] << ", "; } cout << "]"<<endl; } struct Comparator{ bool operator()(pair <string ,int> a, pair <string, int> b){ if(a.second != b.second) return !(a.second < b.second); return !(a.first > b.first); } }; class Solution { public: static bool cmp(pair <string, int> a, pair <string, int> b){ if(a.second != b.second) return a.second > b.second;; return a.first < b.first; } vector<string> topKFrequent(vector<string>& words, int k) { map<string, int> m; priority_queue < pair <string, int>, vector < pair <string, int> >, Comparator > v; for(int i = 0; i < words.size(); i++){ m[words[i]]++; } map<string, int> :: iterator i = m.begin(); while(i != m.end()){ if(v.size() < k){ v.push(*i); } else if(v.top().second < i->second){ v.pop(); v.push(*i); } else if(v.top().second == i->second && v.top().first > i->first){ v.pop(); v.push(*i); } i++; } vector <string> res; while(!v.empty()){ pair <string, int> temp = v.top(); v.pop(); res.push_back(temp.first); } reverse(res.begin(), res.end()); return res; } }; main(){ Solution ob; vector<string> v = {"the", "sky", "is", "blue", "the", "weather", "is", "comfortable"}; print_vector(ob.topKFrequent(v, 3)); }
输入项
["the", "sky", "is", "blue", "the", "weather", "is", "comfortable"] 3
输出结果
["is","the","blue"]