451. 根据字符出现频率排序 力扣(中等) 结构体+优先队列+map,一直tle找到原因了

题目描述:

给定一个字符串,请将字符串里的字符按照出现的频率降序排列。

示例 1:

输入:
"tree"

输出:
"eert"

解释:
'e'出现两次,'r'和't'都只出现一次。
因此'e'必须出现在'r'和't'之前。此外,"eetr"也是一个有效的答案。

题源:https://leetcode-cn.com/problems/sort-characters-by-frequency/

注意点:

  1. priority_queue和sort中比较函数写法不同,具体如下:
  2. 队列的比较函数,是需要有一个结构体的。
        struct node
            {
                char ch;
                int ti;
                node(char a,int b) {ch=a; ti=b;}
            };
         struct cmp
        {
            bool operator()(node a,node b)
            {
                if(a.ti!=b.ti) return a.ti<b.ti;   //表示从大到小,是反着来的
                  else return a.ch>b.ch;
            }        
        };
    priority_queue<node,vector<node>, cmp> Q;
    
    
    而sort的比较函数是,直接一个bool型函数即可:
    static  bool cmp(node a,node b)   //需要加上static,不然报错
    {
        return a>b;   //从大到小排列。
    }
    sort(a,a+n,cmp); //  sort(a.begin(),a.end(),cmp); 
  3. map<char, int> mp,取键值用  .first,取值  .second
  4. string类型的变量,a=a+char 和 a+=char是两种效率,这题就出现了这个问题。血的教训。
class Solution {
public:
    struct node
        {
            char ch;
            int ti;
            node(char a,int b) {ch=a; ti=b;}
        };
    struct cmp
    {
        bool operator()(node a,node b)
        {
            if(a.ti!=b.ti) return a.ti<b.ti;
              else return a.ch>b.ch;
        }        
    };

    string frequencySort(string s) {
        
        int l=s.length();
        map<char , int> mp;
        for(int i=0;i<l;i++)  mp[s[i]]++;
        
        priority_queue<node,vector<node>, cmp> Q;
        //priority_queue<node> Q;
        for(auto p : mp)  
            Q.push(node(p.first,p.second));
        
        string res;
        while(!Q.empty())
        {
            node p=Q.top();
            for(int i=0;i<p.ti;i++) res+=p.ch; //res=res+p.ch; 如果是后面这种写法,tle,相当于重新赋值,而不是在末尾加上一个字符。
            Q.pop();
        }
        return res;
    }
};

原文地址:https://www.cnblogs.com/stepping/p/14967409.html