力扣347前k个高频元素
题目描述
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:
输入: nums = [1], k = 1
输出: [1]
AC代码
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
// 处理元素和元素的出现次数的映射
// 例如1, 1, 1,表示1出现了3次
// 则map[1] = 3
unordered_map<int, int> map;
for (auto x : nums) map[x] ++ ;
// 采用桶排序/计数排序的思想
// 桶排序/计数排序映射元素出现次数和元素本身(原本思想)
// 对应本题元素出现次数和元素个数
// 例如:1, 1, 2
// 则s[0] = 0,表示出现0次(索引/下标)的元素有0个(值)
// 则s[1] = 1,表示出现1次个元素有一个
// s[2] = 1,出现两次的元素有1一个
int n = nums.size();
vector<int> s(n + 1);
for (auto [x, c] : map) s[c] ++ ;
// 统计出次数最多的前k个元素的下界
// 例如:1,1,2且k = 1
// 则s[0] = 0,表示出现0次的元素有0个
// 则s[1] = 1,表示出现1次个元素有一个
// s[2] = 1,出现两次的元素有1一个
// 那么显然,下界为1
int i = n, t = 0;
while (t < k) t += s[i -- ];
// 此时从hash表里查找出现次数大于1的元素
// 显然答案:key = 1, val = 2(1出现2次)
vector<int> res;
for (auto [x, c] : map)
if (c > i)
res.push_back(x);
return res;
}
};
思路
见注释