给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:
输入: nums = [1], k = 1
输出: [1]
说明:
执行用时 :16 ms, 在所有 cpp 提交中击败了99.62%的用户
内存消耗 :11.9 MB, 在所有 cpp 提交中击败了10.71%的用户
bool static compare(const pair<int, int>& a, const pair<int, int>& b) {
return a.second > b.second;
}
vector<int> topKFrequent(vector<int>& nums, int k) {
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);
auto beg = resultTemp.begin();
while (k--) {
res.push_back(beg->first);
beg++;
}
return res;
}执行用时 :24 ms, 在所有 cpp 提交中击败了83.01%的用户
内存消耗 :11.2 MB, 在所有 cpp 提交中击败了87.09%的用户
求前 k 大,用小根堆,求前 k 小,用大根堆。面试的时候如果说反了会挂!
struct compare {
bool operator()(const pair<int, int>& a, const pair<int, int>& b) {
return a.second > b.second;
}
};
vector<int> topKFrequent(vector<int>& nums, int k) {
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();
}
return ret;
}