给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:
输入: nums = [1], k = 1
输出: [1]
提示:
1 <= nums.length <= 105
k 的取值范围是 [1, 数组中不相同的元素的个数]
题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的
这道题开始我想的是用一个map来把不同nums的数目统计起来,再将这些数目value进行排序,然后通过k的大小很轻易就从排序后的map中找到对应元素;
但是,这有一个问题,就是如何对value进行排序,这个map里面是一组组pair类型的数据,key和value都是相关联的,我没有想到排序方法,所以换了个思路,时间复杂度可能相对较高,但是提交后结果还算不错
这里就直接上代码了,注释在代码里,
基本上就分为了三步;
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int, int> hash;
//统计不同nums数目
for (int i : nums) {
hash[i]++;
}
//找到nums中出现次数最多的数据
int maxelem = 0;
for (auto i : hash) {
if (i.second > maxelem) {
maxelem = i.second;
}
}
//从最大的开始将出现频率前k高的元素存放到ans中
//这里很巧妙,也是关键,多看看就能明白了
vector<int> ans;
while (k > 0) {
for (auto i : hash) {
if (i.second == maxelem) {
ans.push_back(i.first);
k--;
}
}
maxelem--;
}
return ans;
}
};