• leetcode692:前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] 的数量]

    思路一:暴力解法,这道题如果没用时间限制,暴力解法很简单的。

    思路二:哈希表+排序;先将words数组的单词按照首字母的字典顺序排序。因为题中说的如果两个单词出现频率相同,优先首字母在前的单词。定义vet——string数组,记录words数组的一次单词,用来后面的按照出现频率排序要求。

    定义unordered_map数组,记录每个单词出现的次数,将每个单词出现的频率存放在path数组中(无顺序要求)。对path数组的元素进行排序,找到前K个元素。再一次对存放string的数组遍历,大于path【k】的存放在之前定义好的变量数组v中(一定要按照从大到小的顺序)。

    完整代码:

    1. class Solution {
    2. public:
    3. vector topKFrequent(vector& words, int k) {
    4. sort(words.begin(),words.end());
    5. vectorvet;
    6. vet.assign(words.begin(),words.end());
    7. vet.erase(unique(vet.begin(),vet.end()),vet.end());
    8. unordered_mapint>mp;
    9. vector<int>path;
    10. vectorv;
    11. for(int i=0;isize();i++)
    12. {
    13. auto it=mp.find(words[i]);
    14. if(it==mp.end())
    15. {
    16. mp[words[i]]=1;
    17. }
    18. else
    19. {
    20. mp[words[i]]++;
    21. }
    22. }
    23. for(int i=0;isize();i++)
    24. {
    25. path.push_back(mp[vet[i]]);
    26. }
    27. sort(path.begin(),path.end());
    28. reverse(path.begin(),path.end());
    29. int x=path[0];
    30. int len=vet.size();
    31. int pos=0;
    32. for(int i=0;i
    33. {
    34. if(mp[vet[i]]==path[0])
    35. {
    36. v.push_back(vet[i]);
    37. path.erase(path.begin());
    38. vet.erase(vet.begin()+i);
    39. i=-1;
    40. pos=pos+1;
    41. }
    42. if(pos==k)
    43. {
    44. break;
    45. }
    46. }
    47. return v;
    48. }
    49. };

    path【i】是从大到小排序的,如果遍历到path【0】,则将vet【i】存放在string数组v中;path【0】、vet【i】将被移除;然后i=-1是重新从数组的起始开始遍历。

    ps:一直是path【0】的原因是每次将path首元素删除后,接着就会有下一个元素补上去,所以一直是path【0】。

    当计数元素pos==k时,说明已经达到题中给的条件,直接结束for()语句。
     

  • 相关阅读:
    第七章 块为结构建模 P5|系统建模语言SysML实用指南学习
    python代码的几种常见加密方式
    Pod控制器详解-Deployment(Deploy)
    计算机毕业设计(附源码)python在线阅读系统
    《系统之美》笔记
    Docker入门学习:基本概念、安装、命令、简单使用
    用于细胞定位的指数距离变换图--Exponential Distance Transform Maps for Cell Localization
    vue管理系统列表行按钮过多, 封装更多组件
    latex,不带行号的algorithm
    Python基础编程入门实例:恺撒密码
  • 原文地址:https://blog.csdn.net/m0_63743577/article/details/126789708