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中(一定要按照从大到小的顺序)。

完整代码:

class Solution {
public:
    vector<string> topKFrequent(vector<string>& words, int k) {
        sort(words.begin(),words.end());
        vector<string>vet;
        vet.assign(words.begin(),words.end());
        vet.erase(unique(vet.begin(),vet.end()),vet.end());
        unordered_map<string,int>mp;
        vector<int>path;
        vector<string>v;
        for(int i=0;i<words.size();i++)
        {
            auto it=mp.find(words[i]);
            if(it==mp.end())
            {
            mp[words[i]]=1;
            }
            else
            {
                mp[words[i]]++;
            }
        }
        for(int i=0;i<vet.size();i++)
        {
            path.push_back(mp[vet[i]]);
        }
        sort(path.begin(),path.end());
        reverse(path.begin(),path.end());
        int x=path[0];
        int len=vet.size();
        int pos=0;
        for(int i=0;i<len;i++)
        { 
            if(mp[vet[i]]==path[0])
            {
                v.push_back(vet[i]);
                path.erase(path.begin());
                vet.erase(vet.begin()+i);
                i=-1;
                pos=pos+1;
            }
            if(pos==k)
            {
                break;
            }
        }
        return v;
    }
};

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

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北方以南ccc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值