欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

LeetCode 692. Top K Frequent Words

程序员文章站 2022-04-25 19:29:33
...

一遍pass很舒服,比较简洁…顺便记录一下

LeetCode 692. Top K Frequent Words
LeetCode 692. Top K Frequent Words

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 节省对字符串的拷贝造成的浪费