451. 根据字符出现频率排序 力扣(中等) 结构体+优先队列+map,一直tle找到原因了
题目描述:
给定一个字符串,请将字符串里的字符按照出现的频率降序排列。
示例 1:
输入:
"tree"
输出:
"eert"
解释:
'e'出现两次,'r'和't'都只出现一次。
因此'e'必须出现在'r'和't'之前。此外,"eetr"也是一个有效的答案。
题源:https://leetcode-cn.com/problems/sort-characters-by-frequency/
注意点:
- priority_queue和sort中比较函数写法不同,具体如下:
-
队列的比较函数,是需要有一个结构体的。 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);
- map<char, int> mp,取键值用 .first,取值 .second
- 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; } };