给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2]
示例 2:
输入: nums = [1], k = 1 输出: [1]
说明:
- 你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。
- 你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。
分析:
关键是对这些数字进行统计,我使用map来进行数字出现次数的统计,对统计情况进行排序,最后得出结果。
代码有点复杂,目前没想出对map更好的排序方法
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
// 计数,int1出现了int2次
map<int,int> map_arr;
// 使用map计数
for(int num:nums)
map_arr[num] ++;
// 遍历读取计数次数
vector<int> arr_count;
map<int,int>::iterator curr = map_arr.begin();
while(curr != map_arr.end()){
arr_count.push_back(curr->second);
curr ++;
}
// 排序,找到第k个高频元素出现的次数
sort(arr_count.begin(),arr_count.end());
int num = arr_count[arr_count.size()-k];
// 遍历map找到出现次数大于num的那个元素
vector<int> result;
curr = map_arr.begin();
while(curr != map_arr.end()){
if(curr->second >= num)
result.push_back(curr->first);
curr ++;
}
return result;
}
};