1、描述
给一非空的单词列表,返回前 k 个出现次数最多的单词。
返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,按字母顺序排序。
示例 1:
输入: [“i”, “love”, “leetcode”, “i”, “love”, “coding”], k = 2
输出: [“i”, “love”]
解析: “i” 和 “love” 为出现次数最多的两个单词,均为2次。
注意,按字母顺序 “i” 在 “love” 之前。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/top-k-frequent-words
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2、关键字
前K,最多,排序,字典序,出现次数排序,返回前k单词
3、思路
思路1:使用哈希表,统计出现的次数,写一个static的回调函数,
思路二:小根堆
4、notes
sort函数排序,的对象是vector,
5、复杂度
时间:O(l×n+l×mlogm)
空间:O(l×m),
6、code
class Solution {
public:
static bool mysort(pair<string,int> & mp1,pair<string,int> &mp2){ // static不带就错,
if(mp1.second ==mp2.second){
return mp1.first < mp2.first; // 字典序排序
}
else{
return mp1.second > mp2.second;// 出现的次数排序
}
}
vector<string> topKFrequent(vector<string>& words, int k) {
unordered_map<string,int>mp; // 哈希表,统计单词出现的次数,
vector<pair<string,int>> mp1; // 为了调用sort排序的函数,
vector<string>res; // 结果集
for (auto& tem : words){
mp[tem]++;
}
for(auto it = mp.begin();it!=mp.end();it++){
mp1.push_back(*it);
}
sort(mp1.begin(),mp1.end(),mysort); // sort函数调用回调函数,是vector类型的函数,unordered_map,不能直接使用,所以下面一句是错的:
// sort(mp.begin(),mp.end(),mysort);
int i = 0; // 这个i,不能在下面一句中一起初始化,
for(auto it = mp1.begin();it !=mp1.end() && i < k;i++,it++) {
res.push_back((*it).first);
}
return res;
}
};