一遍pass很舒服,比较简洁…顺便记录一下
static const auto __________ = []()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
return nullptr;
}();
struct cmp
{
bool operator() (pair<int, string>& a, pair<int, string>& b)
{
if (a.first == b.first)
return a.second > b.second;
return a.first < b.first;
}
};
class Solution {
public:
vector<string> topKFrequent(vector<string>& words, int k) {
unordered_map<string, int> map;
for (string word : words)
{
++map[word];
}
priority_queue<pair<int, string>, vector<pair<int, string>>, cmp> heap;
for (auto kv : map)
{
heap.push(make_pair(kv.second, kv.first));
}
vector<string> res;
res.reserve(k);
for (int i = 0; i < k; ++i)
{
res.push_back(heap.top().second);
heap.pop();
}
return res;
}
};
- 最上面一个函数就当是个作弊器吧,节省io时间…
struct cmp
重载了()
运算符,是个函数对象,为了能让优先级队列按照题目要求进行堆的排序- 由于知道最终结果包含多少个元素,使用
vector::reserve()
能预留充足空间,避免k值很大时空间不足多次重新分配空间+拷贝的时间
下面的方法是经某大佬指点做修改后的结果
class Solution {
public:
vector<string> topKFrequent(vector<string>& words, int k) {
unordered_map<string, int> map;
for (string& word : words)
{
++map[word];
}
priority_queue<pair<int, string>, vector<pair<int, string>>, cmp> heap;
for (auto& kv : map)
{
heap.push(make_pair(kv.second, move(kv.first)));
}
vector<string> res;
res.reserve(k);
for (int i = 0; i < k; ++i)
{
res.push_back(move(heap.top().second));
heap.pop();
}
return res;
}
};
- 第一个循环用
string&
规避循环过程中可能会调用拷贝构造函数创建临时对象 auto&
原理同上- 两处使用
move
节省对字符串的拷贝造成的浪费