题意
给定String
类型的数组strArr
,再给定整数k
,请严格按照排名顺序打印出次数前k
名的字符串。
[要求]
如果strArr长度为N,时间复杂度请达到O(N \log K)O(NlogK)
输出K
行,每行有一个字符串和一个整数(字符串表示)。
你需要按照出现出现次数由大到小输出,若出现次数相同时字符串字典序较小的优先输出
题解
#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;
}
};