问题描述 :
给定一个非空的整数数组,返回其中出现频率前 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 个高频元素的集合是唯一的。
输出时,首先输出频率最高的元素,如果频率相同,则先输出元素值较大的元素。
输入说明 :
首先输入nums数组的长度n,
然后输入n个整数,以空格分隔。
最后输入k。
输出说明 :
首先输出频率最高的元素,如果频率相同,则先输出元素值较大的元素。
元素之间以空格分隔。
输入范例 :
8
1 1 1 2 2 3 3 4
3
输出范例 :
1 3 2
#include<iostream> #include<map> #include<queue> #include<vector> using namespace std; class Solution { public: struct Cell { pair<int, int> data; Cell(pair<int, int> _data) :data(_data) {}; bool operator <(const Cell& c) const { if (data.second > c.data.second) return 1; else if (data.second == c.data.second) return data.first > c.data.first; else return 0; } }; //使用小顶堆 满了的时候把最小的pop出去 剩下的就是k个频率最高的 vector<int> topKFrequent(vector<int>& nums, int k) { vector<int> res; map<int, int> hash; for (auto item : nums) hash[item]++; priority_queue<Cell> que;//小顶堆 for (auto a : hash) { que.push(make_pair(a.first, a.second)); if (que.size() > k) que.pop(); } while (!que.empty()) { res.push_back(que.top().data.first); que.pop(); } return res; } }; int main() { vector<int> v; vector<int> res; int len, n; int data; cin >> len; for (int i = 0; i < len; i++) { cin >> data; v.push_back(data); } cin >> n; res = Solution().topKFrequent(v, n); int size = res.size(); for (int i = size - 1; i > 0; i--) cout << res[i] << " "; cout << res[0]<<endl; return 0; }