优先队列出队的是当前优先级最高的元素,我们要做的是把出现次数多的留下,所以比较器要以次数少为优先级高,其逻辑与默认的less行为相反
vector<vector<string> > topKstrings(vector<string>& strings, int k) {
// write code here
vector<vector<string> > ans;
if (strings.empty() || strings.size() < k)
return ans;
// 记录每个元素出现的次数
unordered_map<string, int> map;
for (const auto& string : strings) {
++map[string];
}
// 按照出现次数排序,次数相同按照字典序
auto cmp = [](const pair<string, int>& p1, const pair<string, int> p2) {
return p1.second==p2.second?p1.first<p2.first:p1.second>p2.second;
};
// 将全部元素入堆
priority_queue<pair<string, int>, vector<pair<string, int>>, decltype(cmp)> min_heap(cmp);
for ( const auto& pair: map) {
min_heap.emplace(pair);
if (min_heap.size() > k)
min_heap.pop();
}
ans.reserve(k);
//出队时是按照出现次数从低到高,因此需要之后reverse
while(!min_heap.empty()) {
auto p = min_heap.top();
//数组不要向begin()位置插入元素,应该插入到end()位置
ans.emplace_back(vector<string>{p.first,to_string(p.second)});
min_heap.pop();
}
reverse(ans.begin(),ans.end());
return ans;
}