题目1:
题目链接
思路1:首先可以使用map来统计单词出现的次数。然后使用vector将pair存起来,接着使用stable_sort排序(要保证数据具有稳定性),然后返回前k个单词即可。
难点:需要写一个比较函数(仿函数)
class Solution {
public:
struct Compare{
//从大到小
bool operator()(const pair<string, int>& kv1, const pair<string, int>& kv2)
{
return kv1.second > kv2.second;
}
};
vector<string> topKFrequent(vector<string>& words, int k) {
//1.统计单词数量
map<string, int> m;
for(auto e:words)
{
m[e]++;
}
//2.放到vector中排序
vector<pair<string, int>> v(m.begin(), m.end());
stable_sort(v.begin(), v.end(), Compare());
vector<string> vv;
for(size_t i = 0; i<k ;i++)
{
vv.push_back(v[i].first);
}
return vv;
}
};
**思路2:**因为stable_sort用的不多,所以我们将使用sort,通过控制仿函数,将它改为稳定的算法!
难点:将sort修改为稳定的!!
class Solution {
public:
struct Compare{
//从大到小
bool operator()(const pair<string, int>& kv1, const pair<string, int>& kv2)
{
//相等,小的在前面
return kv1.second > kv2.second || (kv1.second==kv2.second)&&(kv1.first<kv2.first);
}
};
vector<string> topKFrequent(vector<string>& words, int k) {
//1.统计单词数量
map<string, int> m;
for(auto e:words)
{
m[e]++;
}
//2.放到vector中排序
vector<pair<string, int>> v(m.begin(), m.end());
sort(v.begin(), v.end(), Compare());
vector<string> vv;
for(size_t i = 0; i<k ;i++)
{
vv.push_back(v[i].first);
}
return vv;
}
};
思路3:使用优先级队列也可以。