题目描述
给一非空的单词列表,返回前 k 个出现次数最多的单词。
返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,按字母顺序排序。
示例
输入: [“i”, “love”, “leetcode”, “i”, “love”, “coding”], k = 2
输出: [“i”, “love”]
解析: “i” 和 “love” 为出现次数最多的两个单词,均为2次。
注意,按字母顺序 “i” 在 “love” 之前。
解题思路
利用map<string,int>将所有单词个数统计出来,并按首字母进行排序。
再用multimap<int,string,greater>将个数从大小排序。
用vector存储前k个高频单词,再打印出来。
C++ 完整代码
主要思想在Solution.topKFrequent()中
#include <iostream>
#include <map>
#include <vector>
using namespace std;
class Solution {
public:
vector<string> topKFrequent(vector<string>& words, int k) {
//1. operator[] 2.find insert 2.insert
map<string,int> countmap; //map已完成数量统计和首字母排序
for(const string& s:words)
countmap[s]++;
multimap<int,string,greater<int>>sortmap; //multimap按value排序
for(const auto&kv:countmap)
sortmap.insert(make_pair(kv.second,kv.first));
vector<string>v;
multimap<int,string>::iterator it=sortmap.begin();
while(it!=sortmap.end()&&k--) //将前k个存入vector中
{
v.push_back(it->second);
++it;
}
return v; //输出vector
}
};
int main()
{
Solution s;
vector <string> v={"i", "love", "leetcode", "i", "love", "coding"};
int k=2;
vector <string> v1;
v1=s.topKFrequent(v,k);
for(int i=0;i<v1.size();i++)
cout<<v1[i]<<" ";
return 0;
}
下一题:前K个高频元素
版权声明:本文为ly_6699原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。