# 前 K 个高频元素
给你一个整数数组 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
个高频元素的集合是唯一的
进阶:你所设计算法的时间复杂度 必须 优于 O(n log n)
,其中 n
是数组大小。
以下错误的选项是?
## aop
### before
```cpp
#include
using namespace std;
```
### after
```cpp
int main()
{
Solution sol;
vector nums = {1, 1, 1, 2, 2, 3};
int k = 2;
vector res;
res = sol.topKFrequent(nums, k);
for (auto i : res)
cout << i << " ";
return 0;
}
```
## 答案
```cpp
class Solution
{
public:
vector topKFrequent(vector &nums, int k)
{
sort(nums.begin(), nums.end());
vector> cnt;
for (int i = 0; i < nums.size();)
{
int count = 1;
while (i + count < nums.size())
count++;
cnt.push_back({nums[i], count});
i += count;
}
sort(cnt.begin(), cnt.end(), cmp);
vector ans(k);
for (int i = 0; i < k; i++)
ans[i] = cnt[i].first;
return ans;
}
};
```
## 选项
### A
```cpp
class Solution
{
public:
vector topKFrequent(vector &nums, int k)
{
unordered_map freq;
for (int i = 0; i < nums.size(); i++)
{
freq[nums[i]]++;
}
priority_queue, vector>, greater>> pq;
for (auto a : freq)
{
if (pq.size() == k)
{
if (a.second > pq.top().first)
{
pq.pop();
pq.push(make_pair(a.second, a.first));
}
}
else
{
pq.push(make_pair(a.second, a.first));
}
}
vector res;
while (!pq.empty())
{
res.push_back(pq.top().second);
pq.pop();
}
return res;
}
};
```
### B
```cpp
class Solution
{
public:
static bool cmp(const vector &a, const vector &b)
{
return a[1] > b[1];
}
vector topKFrequent(vector &nums, int k)
{
vector a;
map list1;
for (int i = 0; i < nums.size(); i++)
{
if (!list1.count(nums[i]))
{
list1.insert(map::value_type(nums[i], 1));
a.push_back(nums[i]);
}
else
{
list1[nums[i]]++;
}
}
vector> b(a.size(), vector(2));
for (int i = 0; i < a.size(); i++)
{
b[i][0] = a[i];
b[i][1] = list1[a[i]];
}
sort(b.begin(), b.end(), cmp);
a.clear();
for (int i = 0; i < k; i++)
{
a.push_back(b[i][0]);
}
return a;
}
};
```
### C
```cpp
class Solution
{
public:
vector topKFrequent(vector &nums, int k)
{
unordered_map nums_count;
for (auto x : nums)
{
nums_count[x]++;
}
multimap> big_m;
for (auto x : nums_count)
{
big_m.insert(make_pair(x.second, x.first));
}
vector res;
for (auto it = big_m.begin(); it != big_m.end() && k; it++, k--)
{
res.push_back(it->second);
}
return res;
}
};
```