题目描述:
给定一个单词列表
words
和一个整数k
,返回前k
个出现次数最多的单词。返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率, 按字典顺序 排序。
示例 1:
输入: words = ["i", "love", "leetcode", "i", "love", "coding"], k = 2
输出: ["i", "love"]
解析: "i" 和 "love" 为出现次数最多的两个单词,均为2次。
注意,按字母顺序 "i" 在 "love" 之前。示例 2:
输入: ["the", "day", "is", "sunny", "the", "the", "the", "sunny", "is", "is"], k = 4
输出: ["the", "is", "sunny", "day"]
解析: "the", "is", "sunny" 和 "day" 是出现次数最多的四个单词,
出现次数依次为 4, 3, 2 和 1 次。
解题思路:
利用map和multimap的特性。先用map以字符串排序统计字符串出现的次数。再利用multimap排序不会改变相同value值的前后顺序,按次数升序统计。
对比前后两个图,相同value值的i和love,multimap排序后 ,i依然在love上面,coding依然在leetcode上面。
所以这时候只需要将前k个输出出来。
遍历multimap的变量M取出M.second的字符串存入vector容器中即可。
代码
class Solution {
public:
vector<string> topKFrequent(vector<string>& words, int k) {
//创建map统计次数
map<string,int> m;
for(auto &e:words)
{
m[e]++;
}
// multimap按value值降序,伪函数greater<int>表示从高到低排
multimap<int,string,greater<int>> sortMap;
for(auto kv:m)
{
sortMap.insert(make_pair(kv.second,kv.first));
}
//存入vector
vector<string> v;
for(auto e:sortMap)
{
if(k==0) break;
v.push_back(e.second);
k--;
}
return v;
}
};