1. 题目描述
2. 思路分析
3. 代码展示
带思路
vector<string> topKFrequent(vector<string>& words, int k) {
//把单词和频率建立map映射关系, 单词作为key
map<string, int> mp;
//map的[]可以进行插入操作
//两种情况: 1.wd不存在, 插入, 且对应的value为默认的0, ++后是1
//2. wd存在, 不进行插入, 直接把对应的value++, 词频+1
//当vector遍历完之后, 单词和词频的映射关系就建立好了
for(auto& wd : words) {
mp[wd]++;
}
//然后我们需要创建一个词频和单词的映射关系, 词频作为key
//词频可能有重复, 所以选择使用multimap
//我们要找的是词频最高的k个单词, 所以给一个大于的比较关系
multimap<int, string, greater<int>> mp2;
//循环遍历mp, 将内容逐个插入mp2
//由于map容器本身是一个搜索树, 插入后本身就是有序的
//而且我们给的是大于比较关系, 所以中序遍历前k个元素即为词频最大的k个单词
//multimap插入元素, 当key相同时, 根据插入的前后顺序进行排序, 即先插入的在前, 后插入的在后
//而且有一个前提: 上面的mp是单词和词频的映射表, 本身也是有序的, 按照字母顺序排序
//so, 当词频一样时, mp2中的单词也一定是按照字母序排序
for(auto& e : mp) {
mp2.insert(make_pair(e.second, e.first));
}
//循环结束时, 已经得到了需要的结构, 只需要遍历mp2的前k个元素即为所求
vector<string> ret;
for(auto& e : mp2) {
if(k == 0)
break;
else {
ret.push_back(e.second);
k--;
}
}
return ret;
}
纯净版
vector<string> topKFrequent(vector<string>& words, int k) {
//把单词和频率建立map映射关系, 单词作为key
map<string, int> mp;
for(auto& wd : words) {
mp[wd]++;
}
//然后我们需要创建一个词频和单词的映射关系, 词频作为key
multimap<int, string, greater<int>> mp2;
for(auto& e : mp) {
mp2.insert(make_pair(e.second, e.first));
}
//循环结束时, 已经得到了需要的结构, 只需要遍历mp2的前k个元素即为所求
vector<string> ret;
for(auto& e : mp2) {
if(k == 0)
break;
else {
ret.push_back(e.second);
k--;
}
}
return ret;
}