Given a non-empty array of integers, return the k most frequent elements.
Example 1:
Input: nums = [1,1,1,2,2,3], k = 2 Output: [1,2]
Example 2:
Input: nums = [1], k = 1 Output: [1]
Note:
- You may assume k is always valid, 1 ≤ k ≤ number of unique elements.
- Your algorithm's time complexity must be better than O(n log n), where n is the array's size.
题意:给出一个整型数组,要求求出输出中出现次数最高的K个数。
思路一:设置一结构体,记录元素的值和出现次数。将每个元素(值 )存储到一个结构体数组中,这里相同值的元素存储在同一个结构体,增加出现次数。使用unordered_map实现元素值与对应结构体下标的映射。
struct Node{
int val;
int cnt;
}node[10010];
bool cmp(Node a,Node b){
return a.cnt>b.cnt;
}
class Solution {
public:
int tot=0;
vector<int> topKFrequent(vector<int>& nums, int k) {
vector<int> vec;
unordered_map<int,int>mp;
for(int i=0;i<nums.size();i++){
if(mp.count(nums[i])){
node[mp[nums[i]]].cnt++;
}else {
mp[nums[i]]=tot;
node[tot].cnt=1;
node[tot++].val=nums[i];
}
}
sort(node,node+tot,cmp);
for(int i=0;i<k;i++){
vec.push_back(node[i].val);
}
return vec;
}
};
思路二:利用优先队列实现。
struct Node{
int val;
int cnt;
}node[10010];
// 对结构体使用优先队列 自定义比较函数
bool operator>(const Node a,const Node b){
return a.cnt>b.cnt;
}
bool operator<(const Node a,const Node b){
return a.cnt<b.cnt;
}
class Solution {
public:
int tot=0;
vector<int> topKFrequent(vector<int>& nums, int k) {
vector<int> vec;
priority_queue<Node,vector<Node>,less<Node> >que;
unordered_map<int,int>mp;
for(int i=0;i<nums.size();i++){
if(mp.count(nums[i])){
node[mp[nums[i]]].cnt++;
}else {
mp[nums[i]]=tot;
node[tot].cnt=1;
node[tot++].val=nums[i];
}
}
for(int i=0;i<tot;i++)
que.push(node[i]);
for(int i=0;i<k;i++){
vec.push_back(que.top().val);
que.pop();
}
return vec;
}
};
思路三(效率高): 使用优先队列和pair对。
typedef pair<int,int> pp;
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int,int>mp;
vector<int>vec;
for(int i=0;i<nums.size();i++)
mp[nums[i]]++;
priority_queue<pp>que;
for(auto it:mp){
// 这里it.second为频率,it.first为元素的值
//que为优先队列,默认按照第一部分元素降序排列,
//即按照频率降序排列。
que.push(make_pair(it.second,it.first));
}
int i=0;
while(i<k){
vec.push_back(que.top().second);
que.pop();
i++;
}
return vec;
}
};