目录
- 1.前言
- 2.题目简介
- 3.求解思路
- 4.示例代码
- 4.1换个稳定排序解决
- 4.2用仿函数强行进行控制
1.前言
ok,好久不写博客了,这里简单的来写一写用到关于容器map来解决前k个高频单词的问题。
当然,这个问题也可以用优先级队列(堆)来解决,这里仅仅是给出其中一种方法。
2.题目简介
题目链接:LINK
3.求解思路
我们的思路就是用map容器统计次数,进行将其拷贝到vector中。
之后把前k个次数大的拷贝到vector中并进行返回。
class Solution {
public:
class comp{
public:
bool operator()(const pair<string, int> p1, const pair<string,int> p2)
{
return p1.second > p2.second;
}
};
vector<string> topKFrequent(vector<string>& words, int k) {
//用map统计次数
map<string, int> m;
for(auto&e:words)
{
m[e]++;
}
//次数统计完之后,我们要把他放到一个vector中进行排序
vector<pair<string, int>> v(m.begin(), m.end());
sort(v.begin(),v.end(),comp());
//把满足条件的按照vector<string>的形式拿出来
vector<string> ret;
for(int i = 0; i < k; i++)
{
ret.push_back(v[i].first);
}
//返回结果
return ret;
}
};
倘若我们按照上面写出代码之后,我们就会发现:会报错!
其实,这个主要是因为虽然我们输出结果是按照统计次数大小排布的,但是相同次数的单词并不符合题目中要求的。
这主要是因为sort函数底层是快排,快排是一种不稳定排序,因此我们可以换一种稳定排序或者是用仿函数加条件强行控制。
4.示例代码
4.1换个稳定排序解决
class Solution {
public:
class comp{
public:
bool operator()(const pair<string, int> p1, const pair<string,int> p2)
{
return p1.second > p2.second;
}
};
vector<string> topKFrequent(vector<string>& words, int k) {
//用map统计次数
map<string, int> m;
for(auto&e:words)
{
m[e]++;
}
//次数统计完之后,我们要把他放到一个vector中进行排序
vector<pair<string, int>> v(m.begin(), m.end());
stable_sort(v.begin(),v.end(),comp());
//把满足条件的按照vector<string>的形式拿出来
vector<string> ret;
for(int i = 0; i < k; i++)
{
ret.push_back(v[i].first);
}
//返回结果
return ret;
}
};
4.2用仿函数强行进行控制
class Solution {
public:
class comp{
public:
bool operator()(const pair<string, int> p1, const pair<string,int> p2)
{
return p1.second > p2.second || (p1.second == p2.second && p1.first < p2.first);
}
};
vector<string> topKFrequent(vector<string>& words, int k) {
//用map统计次数
map<string, int> m;
for(auto&e:words)
{
m[e]++;
}
//次数统计完之后,我们要把他放到一个vector中进行排序
vector<pair<string, int>> v(m.begin(), m.end());
sort(v.begin(),v.end(),comp());
//把满足条件的按照vector<string>的形式拿出来
vector<string> ret;
for(int i = 0; i < k; i++)
{
ret.push_back(v[i].first);
}
//返回结果
return ret;
}
};
EOF