• 【LeetCode】【前K个高频单词】


    力扣

    给定一个单词列表 words 和一个整数 k ,返回前 k 个出现次数最多的单词。

    返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率, 按字典顺序 排序

    示例 1:

    输入: words = ["i", "love", "leetcode", "i", "love", "coding"], k = 2
    输出: ["i", "love"]
    解析: "i" 和 "love" 为出现次数最多的两个单词,均为2次。
        注意,按字母顺序 "i" 在 "love" 之前。
    示例 2:

    输入: ["the", "day", "is", "sunny", "the", "the", "the", "sunny", "is", "is"], k = 4
    输出: ["the", "is", "sunny", "day"]
    解析: "the", "is", "sunny" 和 "day" 是出现次数最多的四个单词,
        出现次数依次为 4, 3, 2 和 1 次。
     

    注意:

    1 <= words.length <= 500
    1 <= words[i] <= 10
    words[i] 由小写英文字母组成。
    k 的取值范围是 [1, 不同 words[i] 的数量]
     

    进阶:尝试以 O(n log k) 时间复杂度和 O(n) 空间复杂度解决。

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/top-k-frequent-words
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

     

     

    目录

     1.使用优先级队列+仿函数

     2.map+仿函数

    3.用stable_sort来保持稳定性,不在仿函数中写相同的频率的字典序排序的方法

    4.使用multimap帮助排序


     1.使用优先级队列+仿函数

    1. class Solution {
    2. public:
    3. struct Less
    4. {
    5. bool operator()(const pairint>&kv1,const pair int>&kv2) const
    6. {
    7. if(kv1.second
    8. {
    9. return true;
    10. }
    11. //频率相同的时候,按照字典序排序,大的在前面
    12. if(kv1.second==kv2.second &&kv1.first>kv2.first)
    13. {
    14. return true;
    15. }
    16. return false;
    17. }
    18. };
    19. vector topKFrequent(vector& words, int k) {
    20. //先统计次数
    21. mapint>countMap;
    22. for(auto& str:words)
    23. {
    24. countMap[str]++;
    25. }
    26. //topk问题
    27. //我们可能想到用堆去做,但是这里相同的出现频率的话,我们用堆很难去保证其单词按照字典序去排序
    28. //但是控制仿函数其实是可以实现的
    29. // priority_queue,vector>,Less>>MaxHeap;
    30. // for(auto&kv:countMap)
    31. // {
    32. // MaxHeap.push(kv);
    33. // }
    34. typedef priority_queueint>,vectorint>>,Less>MaxHeap;
    35. //迭代器区间初始化
    36. MaxHeap mh(countMap.begin(),countMap.end());
    37. vector v;
    38. while(k--)
    39. {
    40. v.push_back(mh.top().first);
    41. mh.pop();
    42. }
    43. return v;
    44. }
    45. };

     2.map+仿函数

    1. class Solution {
    2. public:
    3. struct greater
    4. {
    5. bool operator()(const pairint>&kv1,const pair int>&kv2) const
    6. {
    7. if(kv1.second>kv2.second)
    8. {
    9. return true;
    10. }
    11. //频率相同的时候,按照字典序排序,小的在前面
    12. if(kv1.second==kv2.second &&kv1.first
    13. {
    14. return true;
    15. }
    16. return false;
    17. }
    18. };
    19. vector topKFrequent(vector& words, int k) {
    20. //先统计次数--默认按照string去排序了
    21. mapint>countMap;
    22. for(auto& str:words)
    23. {
    24. countMap[str]++;
    25. }
    26. //将map中的数据转移到vector中,使用迭代器区间构造
    27. vectorint>> sortV(countMap.begin(),countMap.end());
    28. sort(sortV.begin(),sortV.end(), greater());
    29. vector v;
    30. for(size_t i=0;i
    31. {
    32. v.push_back(sortV[i].first);
    33. }
    34. return v;
    35. }
    36. };

    3.用stable_sort来保持稳定性,不在仿函数中写相同的频率的字典序排序的方法

    1. class Solution {
    2. public:
    3. struct greater
    4. {
    5. bool operator()(const pairint>&kv1,const pair int>&kv2) const
    6. {
    7. if(kv1.second>kv2.second)
    8. {
    9. return true;
    10. }
    11. // //频率相同的时候,按照字典序排序,小的在前面
    12. // if(kv1.second==kv2.second &&kv1.first
    13. // {
    14. // return true;
    15. // }
    16. return false;
    17. }
    18. };
    19. vector topKFrequent(vector& words, int k) {
    20. //先统计次数--默认按照string去排序了
    21. mapint>countMap;
    22. for(auto& str:words)
    23. {
    24. countMap[str]++;
    25. }
    26. //将map中的数据转移到vector中,使用迭代器区间构造
    27. vectorint>> sortV(countMap.begin(),countMap.end());
    28. stable_sort(sortV.begin(),sortV.end(), greater());
    29. vector v;
    30. for(size_t i=0;i
    31. {
    32. v.push_back(sortV[i].first);
    33. }
    34. return v;
    35. }
    36. };

     

    4.使用multimap帮助排序

    1. class Solution {
    2. public:
    3. vector topKFrequent(vector& words, int k) {
    4. //先统计次数--默认按照string去排序了
    5. mapint>countMap;
    6. for(auto& str:words)
    7. {
    8. countMap[str]++;
    9. }
    10. //让它是降序,顺着去取,不能是反向迭代器反着取,这样不能保证稳定性
    11. //这里我们的multimap再插入相同的频率的数据的时候,是会在后面插入的,不会影响我们程序的稳定性
    12. multimap<int ,string,greater<int>> sortMap;
    13. for(auto &kv:countMap)
    14. {
    15. sortMap.insert(make_pair(kv.second,kv.first));
    16. }
    17. vector v;
    18. multimap<int,string,greater<int>>::iterator it=sortMap.begin();
    19. for(size_t i=0;i
    20. {
    21. v.push_back(it->second);
    22. ++it;
    23. }
    24. return v;
    25. }
    26. };

     

  • 相关阅读:
    js异步编程面试题你能答上来几道
    c# 反射
    人们对区块链的认识开始变得深入和完善,另一条新路径开始衍生
    vue3 pinia
    十四届蓝桥青少组模拟赛Python-20221108
    NOIP2018 普及组复赛题解
    实用篇-ES-DSL查询文档
    【rbac简介】
    sed命令使用总结
    网络编程(一)
  • 原文地址:https://blog.csdn.net/weixin_62684026/article/details/127584112