18 前 K 个高频元素
作者:
晚于: 2020-07-15 12:00:00后提交分数乘系数50%
截止日期: 2020-07-22 12:00:00
问题描述 :
给定一个非空的整数数组,返回其中出现频率前 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 是数组的大小。
题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。
输出时,首先输出频率最高的元素,如果频率相同,则先输出元素值较大的元素。
可使用以下main函数:
int main()
{
int n,data,k;
vector<int> nums;
cin>>n;
for(int i=0; i<n; i++)
{
cin>>data;
nums.push_back(data);
}
cin>>k;
vector<int> res=Solution().topKFrequent(nums,k);
for(int i=0; i<res.size(); i++)
{
if (i>0)
cout<<" ";
cout<<res[i];
}
return 0;
}
输入说明 :
首先输入nums数组的长度n,
然后输入n个整数,以空格分隔。
最后输入k。
输出说明 :
首先输出频率最高的元素,如果频率相同,则先输出元素值较大的元素。
元素之间以空格分隔。
输入范例 :
8 1 1 1 2 2 3 3 4 3
输出范例:
1 3 2
#include <queue> #include <iostream> #include <vector> #include <map> using namespace std; class Solution { public: vector<int> topKFrequent(vector<int>& nums, int k) { map<int,int> map; for(int i : nums) map[i] ++; //遍历 priority_queue< pair<int,int>, vector< pair<int,int> >, greater< pair<int,int> > > Q; //最小堆 for(auto it : map) if(Q.size() == k) { //队列满了 if(it.second > Q.top().first) { //堆排 Q.pop(); Q.push(make_pair(it.second, it.first)); } } else Q.push(make_pair(it.second, it.first)); vector<int> res; while(Q.size()) { //将优先队列中k个高频元素存入vector res.push_back(Q.top().second); Q.pop(); } return vector<int>(res.rbegin(), res.rend()); } }; int main() { int n,data,k; vector<int> nums; cin>>n; for(int i=0; i<n; i++) { cin>>data; nums.push_back(data); } cin>>k; vector<int> res=Solution().topKFrequent(nums,k); for( int i=0; i<res.size(); i++) { if (i>0) cout<<" "; cout<<res[i]; } return 0; }