题目:
- 给你一个整数数组
nums
和一个整数k
,请你返回其中出现频率前k
高的元素。你可以按 任意顺序 返回答案。
示例:
- 输入: n u m s = [ 1 , 1 , 1 , 2 , 2 , 3 ] , k = 2 nums = [1,1,1,2,2,3], k = 2 nums=[1,1,1,2,2,3],k=2
- 输出: [ 1 , 2 ] [1, 2] [1,2]
解题思路:
先扫描一遍nums
,用哈希表记录每个数出现的频率(次数)。然后利用计数排序,对频率进行排序。扫描计数数组,找到前k
个高频元素的位置,遍历哈希表,将其加入结果集中返回。
C++
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
// 定义哈希表来存放每个元素出现次数
unordered_map<int, int> hash;
for(int i = 0; i < nums.size(); i++){
hash[nums[i]] ++;
}
int n = nums.size();
vector<int> count(n + 1);
// 计数排序,count数组中的下标含义:下标i代表某个数出现次数为i的个数
for(auto [k, v] : hash){
count[v]++;
}
int t = 0, i = n;
// 找到前k个高频的数的位置
while(t < k) t += count[i--];
vector<int> res;
// 将出现频率大于次数的数放入结果集
for(auto [k, v] : hash){
if(v > i) res.push_back(k);
}
return res;
}
};
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
n
)
O(n)
O(n)