思路
1、使用优先级队列,构建大根堆或者小根堆
2、使用map<string, int>记录每一个string出现的次数
代码
class Solution { public: /** * return topK string * @param strings string字符串vector strings * @param k int整型 the k * @return string字符串vector<vector<>> */ /* // 小根堆,头部是小的 struct cmp{ bool operator()(const pair<string, int>& p1, const pair<string, int>& p2 ){ return(p1.second>p2.second || (p1.second==p2.second && p1.first<p2.first)); } }; vector<vector<string> > topKstrings(vector<string>& strings, int k) { // write code here vector<vector<string>> res; unordered_map<string, int> umap; for(auto ele:strings){ umap[ele]+=1; } // 优先级队列表示堆 priority_queue<pair<string, int>, vector<pair<string, int>>, cmp> pq; for(const auto& ele:umap){ if(pq.size()<k){ pq.emplace(pair<string, int>(ele.first, ele.second)); } else if( ele.second>pq.top().second || (ele.second==pq.top().second && ele.first<pq.top().first) ){ pq.pop(); pq.emplace(pair<string, int>(ele.first, ele.second)); } } while(!pq.empty()){ res.push_back(vector<string> {pq.top().first, to_string(pq.top().second)}); pq.pop(); } reverse(res.begin(), res.end()); return res; } */ // 大根堆,头部是大的, struct cmp{ bool operator()(const pair<string, int>& p1, const pair<string, int>& p2 ){ return(p1.second<p2.second || (p1.second==p2.second && p1.first>p2.first)); } }; vector<vector<string> > topKstrings(vector<string>& strings, int k) { // write code here vector<vector<string>> res; unordered_map<string, int> umap; for(auto ele:strings){ umap[ele]+=1; } // 优先级队列表示堆,将map中的所有元素放进去 priority_queue<pair<string, int>, vector<pair<string, int>>, cmp> pq; for(const auto& ele:umap){ pq.emplace(pair<string, int>(ele.first, ele.second)); } int i = 0; while(!pq.empty() && i<k){ res.push_back(vector<string> {pq.top().first, to_string(pq.top().second)}); pq.pop(); i++; } // reverse(res.begin(), res.end()); return res; } };