TopN问题,一定要想到用堆
出现次数的TopK问题
http://www.nowcoder.com/questionTerminal/fd711bdfa0e840b381d7e1b82183b3ee
小顶堆:如果只看num的话是小顶堆。
如果num相同的,则按字符串看是大顶堆。
此时从堆中取出元素,刚好是想要结果的逆序。再reverse即可。或者如下代码,直接把堆顶元素放到vector末尾。
#include<string> #include<unordered_map> #include<queue> using namespace std; class Solution { public: struct Item { Item(const string &str="", int n = 0):s(str),num(n){} string s; int num; bool operator<(const Item &oth)const{ if(num == oth.num){ return s < oth.s; } return num > oth.num; } }; /** * 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) { std::unordered_map<string, int> H; for(auto &s : strings){ H[s]++; } priority_queue<Item> Q; for(auto ite = H.begin(); ite != H.end(); ite++){ Q.push(Item(ite->first, ite->second)); if(Q.size() > k){ Q.pop(); } } vector<vector<string> > ans; k = k > Q.size() ? Q.size() : k; ans.resize(k); while(k--){ auto t = Q.top(); Q.pop(); ans[k].push_back(t.s); ans[k].push_back(std::to_string(t.num)); } return ans; } };