【LeetCode451】根据字符出现频率排序(优先队列)

举报
野猪佩奇996 发表于 2022/01/24 23:42:12 2022/01/24
【摘要】 一、题目 二、思路 (1)根据词频排序,很容易想到用哈希表统计每个字符的个数,然后排序。对于“求前k个”或“排序”的题目可以使用堆排序,用优先级队列实现最大堆,进行堆排序,堆顶即当前的最大值。因...

一、题目

在这里插入图片描述
在这里插入图片描述

二、思路

(1)根据词频排序,很容易想到用哈希表统计每个字符的个数,然后排序。对于“求前k个”或“排序”的题目可以使用堆排序,用优先级队列实现最大堆,进行堆排序,堆顶即当前的最大值。因为我们的pair<char, int>second才是对应字符(first)的词频,需要的是对second进行排序,所以重写cmp

(2)string(num, c)是生成一个包含num个c字符的字符串,这题试了用for循环实现竟然会超时。

(3)其实vector就能够排序了,不用priority_queue也是可以的。

【C++中STL的优先级队列】
在C++的stl中有priority_queue优先级队列,其具体参数如下:
priority_queue<Type, Container, Functional>

  • Type 就是数据类型,
  • Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector)
  • Functional 就是比较的方式。

PS:当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆。

cmp:大的优先级在前面,注意:堆的优先级的返回值与排序的正好相反。

三、代码

class Solution {
struct cmp{
    bool operator()(pair<char, int>&a, pair<char, int>&b){
        return a.second < b.second;
        //大的优先级在前面,注意:堆的优先级的返回值与排序的正好相反
    }
};
public:
    using stu = pair<char, int>; 
    string frequencySort(string s) {
        unordered_map<char, int>mp(26);
        for(int i = 0; i < s.size(); i++){
            mp[s[i]]++;
        }
        priority_queue<stu, vector<stu>, cmp>pq;
        for(auto &[key, value]: mp){
            //每一个pair
            pq.push({key, value});
        }
        string ans = "";
        while(!pq.empty()){
            auto [c, num] = pq.top();
            pq.pop();
            ans = ans + string(num, c);
        }
        return ans;
    }
};

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

在这里插入图片描述

文章来源: andyguo.blog.csdn.net,作者:山顶夕景,版权归原作者所有,如需转载,请联系作者。

原文链接:andyguo.blog.csdn.net/article/details/122610215

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。