LeetCode 347. 前K个高频元素
输入一个整数数组和一个整数k,返回其中出现频率前k高的元素。保证答案唯一,不会出现返回元素的个数大于k的情况,可以按任意顺序返回答案。
思路:
-
建立哈希表统计每个元素出现的次数
-
建立容量为10001的vector表示:出现次数i-出现次数都为i的全部元素[元素1,元素2…];
vector<vector<int>> topK(10001,vector<int>{});
topK[i.second].push_back(i.first);
与此同时维护出现的最多次数biggest_num,方便返回答案时直接从容器biggest_num的位置向ans压入数据,减少从容器10000位置向前寻找第一个出现次数都为i的全部元素[]不为空的时间
-
向ans压入k次数据
c++代码实现
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int,int> hash;
vector<int> ans;
int biggest_num=0;
for(int num:nums)
{
hash[num]++; // 1.建立哈希表统计每个元素出现的次数
}
vector<vector<int>> topK(10001,vector<int>{});
for(auto i:hash)
{
topK[i.second].push_back(i.first); // 2.建立容量为10001的vector记录 出现次数i-出现次数都为i的全部元素[元素1,元素2...]
biggest_num = max(biggest_num,i.second); // 2.与此同时维护出现的最多次数biggest_num
}
while(k>0) // 3.向ans压入k次数据
{
while(!topK[biggest_num].empty())
{
ans.push_back(topK[biggest_num].back()); // 3.直接从容器biggest_num的位置向ans压入数据,减少从容器10000位置向前寻找第一个出现次数都为i的全部元素[]不为空的时间
k--;
topK[biggest_num].pop_back();
}
biggest_num--;
}
return ans;
}
};