出现次数的topK问题

题目描述
给定String类型的数组strArr,再给定整数k,请严格按照排名顺序打印 出次数前k名的字符串。
[要求]
如果strArr长度为N,时间复杂度请达到O(N \log K)O(NlogK)

输出K行,每行有一个字符串和一个整数(字符串表示)。
你需要按照出现出现次数由大到小输出,若出现次数相同时字符串字典序较小的优先输出

示例1
输入

["1","2","3","4"],2

返回值

[["1","1"],["2","1"]]

示例2
输入

["1","1","2","3"],2

返回值

[["1","2"],["2","1"]]
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) {
        //先用int计数 然后再用to_string把它转换成字符串
        map<string, int> mp;
        vector<vector<string>> res;
        
        for(const auto &i : strings){
            mp[i]++;
        }
        for(auto it = mp.begin(); it != mp.end(); it++){
            res.push_back( {it->first,to_string(it->second)} );
        }
        
        /*sort(word.begin(),words.end(),
        [](const string &a, const string &b){
        return a.size() < b.size();
    });*/
        sort(res.begin(), res.end(),
             [](vector<string> &m, vector<string> &n){
            //如果是mp[0]=1;mp[1]=1
                 if(m[1] == n[1]){
                     return m[0] < n[0];
                 } else { //mp[1] = '2' mp[2] = '1' 得把'2'变成 2
                     return stoi(m[1]) > stoi(n[1]);
                 }
                 
        });
        
        //重新赋大小 不重新赋大小 会多出["3","1"]
        res.resize(k);
        return res;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_43599304/article/details/115360485
今日推荐