347.前 K 个高频元素
题目:给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
示例 1: 输入: nums =
[1,1,1,2,2,3], k = 2 输出: [1,2]
示例 2: 输入: nums = [1], k = 1 输出: [1]
思路:
建立哈希表取出最大频率,建立桶存入对应频率的所有元素,从最大频率开始倒序遍历。
1.构建哈希表来存放对应元素的频率,并求出最大频率
2.定义一个桶,遍历哈希表,存入对应频率的元素值。
3.定义一个结果容器ans,从最大频率开始遍历。找到对应频率的元素插入ans
4.若ans的大小为k,满足了题目要求,返回
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k)
{
//建立一个哈希表来存放元素和其对应的频率
unordered_map<int, int> count;
int max_freq = 1;
for(const int n:nums)
{
//取出当前元素的最大频率
max_freq = max(max_freq, ++count[n]);
}
//利用哈希表建立一个桶
unordered_map<int, vector<int>> buckets;
for(const auto& k:count)
{
//遍历哈希表,桶中存入同一频率对应的元素
// k.second为对应的频率 k.first为对应频率的元素
buckets[k.second].push_back(k.first);
}
vector<int> ans;//构建一个vector存放最终结果
//从最大频率开始逐次往下遍历
for(int i = max_freq; i>= 1; i--)
{
//找到对应频率的向量(向量中存放的是对应频率的元素)
auto it = buckets.find(i);
//如果没有则跳出本次循环,不执行后面语句,进行下一次循环
if( it == buckets.end()) continue;
//插入当前频率的元素
ans.insert(ans.end(),it->second.begin(), it->second.end());
//如果ans大小等于k,满足了题目条件,返回
if(ans.size() == k) return ans;
}
return ans;
}
};