C++,利用STL的priority_queue

字符串出现次数的TopK问题

http://www.nowcoder.com/practice/fd711bdfa0e840b381d7e1b82183b3ee

优先队列出队的是当前优先级最高的元素,我们要做的是把出现次数多的留下,所以比较器要以次数少为优先级高,其逻辑与默认的less行为相反

    vector<vector<string> > topKstrings(vector<string>& strings, int k) {
        // write code here
        vector<vector<string> > ans;
        if (strings.empty() || strings.size() < k)
            return ans;
        // 记录每个元素出现的次数
        unordered_map<string, int> map;
        for (const auto& string : strings) {
            ++map[string];
        }
        // 按照出现次数排序,次数相同按照字典序
        auto cmp = [](const pair<string, int>& p1, const pair<string, int> p2) {
            return p1.second==p2.second?p1.first<p2.first:p1.second>p2.second;
        };
        // 将全部元素入堆
        priority_queue<pair<string, int>, vector<pair<string, int>>, decltype(cmp)> min_heap(cmp);
 
        for ( const auto& pair: map) {
            min_heap.emplace(pair);
            if (min_heap.size() > k)
                min_heap.pop();
        }
         ans.reserve(k);
         //出队时是按照出现次数从低到高,因此需要之后reverse
         while(!min_heap.empty()) {
            auto p = min_heap.top();
            //数组不要向begin()位置插入元素,应该插入到end()位置
            ans.emplace_back(vector<string>{p.first,to_string(p.second)});
            min_heap.pop();
         }
         reverse(ans.begin(),ans.end());
         return ans;
    }
全部评论

相关推荐

时雨h:人生就像站在岔路口,两个方向都可以先了解了解,就像罗伯特·弗罗斯特诗里说的,“黄色的树林里分出两条路,可惜我不能同时去涉足” ,这两个方向就如同那两条路,每条都有独特的风景与未知。 除了自行探索,也可以看看自己学校往年同专业学长学姐的去向,每一届大致都差不多,这能帮你找到自己的定位。多跟他们交流交流,听听他们在不同选择中的收获与遗憾,那些过来人的经验会成为你前行路上的微光。 做出选择后,固然要坚定自己的选择,勇往直前地走下去,但也别忘了,那条未选择的路也始终在那里,它或许代表着另一种可能,另一种人生轨迹。偶尔回望,它能让你更加明白自己当下选择的价值,也能让你在前行的路上,多一份思考与从容。
点赞 评论 收藏
分享
评论
2
1
分享

创作者周榜

更多
牛客网
牛客企业服务