题目:
Given a non-empty array of integers, return the k most frequent elements.
思路:
我是用比较暴力的方法求解了一遍,先全部排序,然后用结构体记录每个值的个数,最后按照个数进行排序,取前k个值。
struct Node{
int count;
int val;
};
int compare(Node a, Node b) {
if (a.count > b.count)
return 1;
return 0;
}
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
sort(nums.begin(), nums.end());
vector<Node> vn;
Node n;
n.count = 1, n.val = nums[0];
vn.push_back(n);
int idx = 0;
for (int i = 1; i < nums.size(); i++) {
if (nums[i] != nums[i-1]) {
n.count = 1, n.val = nums[i];
vn.push_back(n);
idx++;
}
else {
vn[idx].count++;
}
}
sort(vn.begin(), vn.end(), compare);
vector<int> ans;
for (int i = 0; i < k; i++) {
ans.push_back(vn[i].val);
}
return ans;
}
};
运行结果(很耗时):
用map+vector的方法:
bool cmp(const pair<int, int>& a, const pair<int, int>& b)
{
return a.second > b.second;
}
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
map<int, int> mp;
for (int i = 0; i < nums.size(); i++) {
mp[nums[i]]++;
}
vector<pair<int, int>> vec(mp.begin(), mp.end());
sort(vec.begin(), vec.end(), cmp);
vector<int> ans;
for (int i = 0; i < k; i++)
ans.push_back(vec[i].first);
return ans;
}
};