347. 前 K 个高频元素
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:
输入: nums = [1], k = 1
输出: [1]
说明:
- 你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。
- 你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。
第一版,普通方法,速度较快
执行用时 :16 ms, 在所有 cpp 提交中击败了99.62%的用户
内存消耗 :11.9 MB, 在所有 cpp 提交中击败了10.71%的用户
boolstatic compare(constpair<int, int>&a, constpair<int, int>&b) {
returna.second>b.second;
}
vector<int>topKFrequent(vector<int>&nums, intk) {
unordered_map<int, int>result(nums.size());//值,次数
for (auto&a : nums) {
result[a]++;
}
vector<pair<int, int>>resultTemp(result.begin(), result.end());
sort(resultTemp.begin(), resultTemp.end(), compare);
vector<int>res;
res.reserve(k);
autobeg=resultTemp.begin();
while (k--) {
res.push_back(beg->first);
beg++;
}
returnres;
}
第二版,用优先队列,第一次学到这个说法
执行用时 :24 ms, 在所有 cpp 提交中击败了83.01%的用户
内存消耗 :11.2 MB, 在所有 cpp 提交中击败了87.09%的用户
求前 k 大,用小根堆,求前 k 小,用大根堆。面试的时候如果说反了会挂!
structcompare {
booloperator()(constpair<int, int>&a, constpair<int, int>&b) {
returna.second>b.second;
}
};
vector<int>topKFrequent(vector<int>&nums, intk) {
vector<int>ret;
unordered_map<int, int>hash;
for (auto&a : nums)
{
hash[a]++;
}
priority_queue<pair<int, int>, vector<pair<int, int>>, compare>freq;
for (auto&a : hash)
{
freq.push(a);
if (freq.size() >k)
freq.pop();
}
while (!freq.empty())
{
ret.push_back(freq.top().first);
freq.pop();
}
returnret;
}