文章目录
- 题目
- 思路1--使用sort排序并优化其稳定性
- 方法一:
- 方法二
- 思路2--multiset
题目
https://leetcode.cn/problems/top-k-frequent-words/description/
思路1–使用sort排序并优化其稳定性
我们可以直接先将每个单词出现的次数用一个CountMap
统计出来,然后放入一个vector
中使用sort
方法
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) {
map<string,int> CountMap;
for(auto e : words)
{
CountMap[e]++;
}
vector<pair<string,int>> v(CountMap.begin(),CountMap.end());//这种构造方式可以记忆一下,非常方便
sort(v.begin(),v.end(),Compare());
vector<string> ret;
for(size_t i = 0;i < k; i++)
{
ret.push_back(v[i].first);
}
return ret;
}
};
但是这样写是不能通过的,因为sort的排序是不稳定的
!
需要我们优化一下:
方法一:
stable_sort
-稳定排序
直接将sort换成stable_sort就可以了
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) {
map<string,int> CountMap;
for(auto e : words)
{
CountMap[e]++;
}
vector<pair<string,int>> v(CountMap.begin(),CountMap.end());//这种构造方式可以记忆一下,非常方便
stable_sort(v.begin(),v.end(),Compare());
vector<string> ret;
for(size_t i = 0;i < k; i++)
{
ret.push_back(v[i].first);
}
return ret;
}
};
方法二
改写一下仿函数的书写规则
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) {
map<string,int> CountMap;
for(auto e : words)
{
CountMap[e]++;
}
vector<pair<string,int>> v(CountMap.begin(),CountMap.end());//这种构造方式可以记忆一下,非常方便
sort(v.begin(),v.end(),Compare());
vector<string> ret;
for(size_t i = 0;i < k; i++)
{
ret.push_back(v[i].first);
}
return ret;
}
};
思路2–multiset
set本身也可以排序,只不过也需要我们自己写一个仿函数
class Solution {
public:
struct Compare
{
bool operator()(const pair<string,int>& kv1,const pair<string,int>& kv2) const
{
return kv1.second > kv2.second || ((kv1.second == kv2.second && kv1.first < kv2.first));
//值大且字典序小的,排在前面
}
};
vector<string> topKFrequent(vector<string>& words, int k) {
map<string,int> CountMap;
for(auto e : words)
{
CountMap[e]++;
}
set<pair<string,int>,Compare> SortSet(CountMap.begin(),CountMap.end());
//使用multiset也可以
vector<string> ret;
auto it = SortSet.begin();
while(k--)
{
ret.push_back(it->first);
++it;
}
return ret;
}
};