- 所有的看注释
class Solution { public: /** * return topK string * @param strings string字符串vector strings * @param k int整型 the k * @return string字符串vector<vector<>> */ vector<vector<string> > topKstrings(vector<string>& strings, int k) { // write code here if(!strings.size() || strings.size()<k) return {}; map<string, int> m; vector<string> ss; vector<vector<string> > res; //排序 sort(strings.begin(),strings.end()); for(int i =0; i< strings.size();i++){ m[strings[i]]++; } //用匿名函数(对于堆而言,数字比骄是相反的,但是字符序时不变的) auto cmp = []( pair<string,int> p1, pair<string,int> p2){ if(p2.second!=p1.second){ return p1.second > p2.second;//最小堆 } return p1.first < p2.first; };//自定义匿名比较器 //注意声明 priority_queue<pair<string,int>,vector<pair<string,int>>, decltype(cmp)> pq(cmp); int i = 0; for(auto it=m.begin(); it!= m.end();it++){ pq.emplace(*it);//map 和 字典是可以互插的。 if (pq.size() > k)// 这是一个小技巧,当大于一的时候,弹走那些尾端最小的就行 //然后每次插入的时候都从头插入就行 pq.pop(); } while(!pq.empty()){ pair<string, int> p = pq.top(); pq.pop(); //从头插,就可以间接逆序。 res.insert(res.begin(), vector<string>{p.first, to_string(p.second)} ); } return res; } };