前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LintCode 550. 最常使用的K个单词II(自定义set(可修改数据的优先队列) + map)

LintCode 550. 最常使用的K个单词II(自定义set(可修改数据的优先队列) + map)

作者头像
Michael阿明
发布2020-07-13 15:58:58
3850
发布2020-07-13 15:58:58
举报
文章被收录于专栏:Michael阿明学习之路

1. 题目

实时数据流中找到最常使用的k个单词. 实现TopK类中的三个方法:

  • TopK(k), 构造方法
  • add(word), 增加一个新单词
  • topk(), 得到当前最常使用的k个单词.
代码语言:javascript
复制
样例 1:
输入:
TopK(2)
add("lint")
add("code")
add("code")
topk()
输出:["code", "lint"]
解释:
"code" 出现两次并且 "lint" 出现一次, 它们是出现最频繁的两个单词。

样例 2:
输入:
TopK(1)
add("aa")
add("ab")
topk()
输出:["aa"]
解释:
"aa" 和 "ab" 出现 , 但是aa的字典序小于ab。

注意事项
如果两个单词有相同的使用频率, 按字典序排名.

2. 解题

  • 优先队列,修改内部数据很麻烦,利用set,自定义其排序规则
  • 遇到要更新的数据,先删除旧的数据,再插入更新的
  • 遇到两点需要注意的,比较操作,必须const,查找存在,不能count,可能是因为自定义 set 的原因。
代码语言:javascript
复制
unordered_map<string, int> wc;
struct cmp {
    bool operator()(const string &a,const string &b) 
    {   //必须写const,不写报错
        if (wc[a] == wc[b])
            return a < b;
        return wc[a] > wc[b];
    }
};

class TopK {
private:
    set<string,cmp> q;
    int K;
public:
    TopK(int k) { K = k;}

    void add(string word) {
        if (q.find(word) != q.end())//必须用find,不能用count
            q.erase(word);
        wc[word]++;
        q.insert(word);
        if (q.size() > K)
            q.erase(--q.end());
    }

    vector<string> topk() {
        return vector<string> (q.begin(), q.end());
    }
};

100% 数据通过测试 总耗时 1314 ms 您的提交打败了 37.80% 的提交!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/03/07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档