前 K 个高频元素
class Solution { public: // 小顶堆 class mycomparison { public: bool operator()(const pair<int, int>& lhs, const pair<int, int>& rhs) { return lhs.second > rhs.second; } }; vector<int> topKFrequent(vector<int>& nums, int k) { unordered_map<int, int>map; for(int i = 0; i < nums.size(); i++){ map[nums[i]]++; //值做索引统计频率 } // 定义一个小顶堆,大小为k priority_queue<pair<int, int>, vector<pair<int, int>>, mycomparison> pri_que; // 建立小顶堆 for (unordered_map<int, int>::iterator it = map.begin(); it != map.end(); it++) { pri_que.push(*it); if (pri_que.size() > k) { // 如果堆的大小大于了K,则队列弹出,保证堆的大小一直为k pri_que.pop(); } } // 找出前K个高频元素,因为小顶堆先弹出的是最小的,所以倒序来输出到数组 vector<int> result(k); for (int i = k - 1; i >= 0; i--) { result[i] = pri_que.top().first; pri_que.pop(); } return result; } };
数据结构基础不好,堆的思想,怎么使用,二叉树,都需要补补,此题也仅仅是照猫画虎背下来了 之后回过头来要继续研究
标签:map,Day29,int,pri,vector,que,小顶,LeetCode,刷题 From: https://www.cnblogs.com/tianmaster/p/16940028.html