- 所有的看注释
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;
}
};