LeetCode 692 : 前K个高频单词

1. 题目描述

在这里插入图片描述


2. 思路分析

在这里插入图片描述


3. 代码展示

带思路

 vector<string> topKFrequent(vector<string>& words, int k) {
        //把单词和频率建立map映射关系, 单词作为key
        map<string, int> mp;

        //map的[]可以进行插入操作
        //两种情况: 1.wd不存在, 插入, 且对应的value为默认的0, ++后是1
        //2. wd存在, 不进行插入, 直接把对应的value++, 词频+1
        //当vector遍历完之后, 单词和词频的映射关系就建立好了 
        for(auto& wd : words) {
            mp[wd]++;
        }

        //然后我们需要创建一个词频和单词的映射关系, 词频作为key
        //词频可能有重复, 所以选择使用multimap
        //我们要找的是词频最高的k个单词, 所以给一个大于的比较关系
        multimap<int, string, greater<int>> mp2;
        
        //循环遍历mp, 将内容逐个插入mp2
        //由于map容器本身是一个搜索树, 插入后本身就是有序的
        //而且我们给的是大于比较关系, 所以中序遍历前k个元素即为词频最大的k个单词
        //multimap插入元素, 当key相同时, 根据插入的前后顺序进行排序, 即先插入的在前, 后插入的在后
        //而且有一个前提: 上面的mp是单词和词频的映射表, 本身也是有序的, 按照字母顺序排序
        //so, 当词频一样时, mp2中的单词也一定是按照字母序排序
        for(auto& e : mp) {
            mp2.insert(make_pair(e.second, e.first));
        }
        //循环结束时, 已经得到了需要的结构, 只需要遍历mp2的前k个元素即为所求
        vector<string> ret;
        for(auto& e : mp2) {
            if(k == 0)
                break;
            else {
                ret.push_back(e.second);
                k--;
            }
        }

        return ret;
    }

纯净版

 vector<string> topKFrequent(vector<string>& words, int k) {
        //把单词和频率建立map映射关系, 单词作为key
        map<string, int> mp;
        for(auto& wd : words) {
            mp[wd]++;
        }

        //然后我们需要创建一个词频和单词的映射关系, 词频作为key
        multimap<int, string, greater<int>> mp2;
        for(auto& e : mp) {
            mp2.insert(make_pair(e.second, e.first));
        }
        
        //循环结束时, 已经得到了需要的结构, 只需要遍历mp2的前k个元素即为所求
        vector<string> ret;
        for(auto& e : mp2) {
            if(k == 0)
                break;
            else {
                ret.push_back(e.second);
                k--;
            }
        }

        return ret;
    }
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

殇&璃

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

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

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

打赏作者

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

抵扣说明:

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

余额充值