文章目录
- 题目
 - 思路1--使用sort排序并优化其稳定性
 - 方法一:
 - 方法二
 
- 思路2--multiset
 
题目
https://leetcode.cn/problems/top-k-frequent-words/description/
 
思路1–使用sort排序并优化其稳定性
我们可以直接先将每个单词出现的次数用一个CountMap统计出来,然后放入一个vector中使用sort方法
class Solution {
public:
    struct Compare
    {
        bool operator()(const pair<string,int>& kv1,const pair<string,int>& kv2)
        {
            return kv1.second > kv2.second;
        }
    };
    vector<string> topKFrequent(vector<string>& words, int k) {
        map<string,int> CountMap;
        for(auto e : words)
        {
            CountMap[e]++;
        }
        vector<pair<string,int>> v(CountMap.begin(),CountMap.end());//这种构造方式可以记忆一下,非常方便
        sort(v.begin(),v.end(),Compare());
        vector<string> ret;
        for(size_t i = 0;i < k; i++)
        {
            ret.push_back(v[i].first);
        }
        return ret;
    }
};
 
但是这样写是不能通过的,因为sort的排序是不稳定的!
 需要我们优化一下:
方法一:
stable_sort-稳定排序
 直接将sort换成stable_sort就可以了
class Solution {
public:
    struct Compare
    {
        bool operator()(const pair<string,int>& kv1,const pair<string,int>& kv2)
        {
            return kv1.second > kv2.second;
        }
    };
    vector<string> topKFrequent(vector<string>& words, int k) {
        map<string,int> CountMap;
        for(auto e : words)
        {
            CountMap[e]++;
        }
        vector<pair<string,int>> v(CountMap.begin(),CountMap.end());//这种构造方式可以记忆一下,非常方便
        stable_sort(v.begin(),v.end(),Compare());
        vector<string> ret;
        for(size_t i = 0;i < k; i++)
        {
            ret.push_back(v[i].first);
        }
        return ret;
    }
};
 
方法二
改写一下仿函数的书写规则
class Solution {
public:
    struct Compare
    {
        bool operator()(const pair<string,int>& kv1,const pair<string,int>& kv2)
        {
            return kv1.second > kv2.second || ((kv1.second == kv2.second && kv1.first < kv2.first));
            //值大且字典序小的,排在前面
        }
    };
    vector<string> topKFrequent(vector<string>& words, int k) {
        map<string,int> CountMap;
        for(auto e : words)
        {
            CountMap[e]++;
        }
        vector<pair<string,int>> v(CountMap.begin(),CountMap.end());//这种构造方式可以记忆一下,非常方便
        sort(v.begin(),v.end(),Compare());
        vector<string> ret;
        for(size_t i = 0;i < k; i++)
        {
            ret.push_back(v[i].first);
        }
        return ret;
    }
};
 
思路2–multiset
set本身也可以排序,只不过也需要我们自己写一个仿函数
class Solution {
public:
    struct Compare
    {
        bool operator()(const pair<string,int>& kv1,const pair<string,int>& kv2) const
        {
            return kv1.second > kv2.second || ((kv1.second == kv2.second && kv1.first < kv2.first));
            //值大且字典序小的,排在前面
        }
    };
    vector<string> topKFrequent(vector<string>& words, int k) {
        map<string,int> CountMap;
        for(auto e : words)
        {
            CountMap[e]++;
        }
        
        set<pair<string,int>,Compare> SortSet(CountMap.begin(),CountMap.end());
        //使用multiset也可以
        vector<string> ret;
        auto it = SortSet.begin();
        while(k--)
        {
            ret.push_back(it->first);
            ++it;
        }
        return ret;
    }
};
                


















![[C++]——C++基础知识点(C++和C语言的区别)](https://img-blog.csdnimg.cn/1fac256c200949339e58a88c2d351a7e.png#pic_center)