力扣:347.前k个高频元素

力扣:347.前k个高频元素

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

示例 1:

输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]

示例 2:

输入: nums = [1], k = 1
输出: [1]

链接:https://leetcode-cn.com/problems/top-k-frequent-elements

思路:

首先用map储存每个元素出现的次数,然后使用优先队列(小顶堆,值小的元素在队首)储存map元素,储存后的优先队列最后k个元素的first就是结果。

优先队列:

class mycmp{
        public:
        bool operator()(const pair<int,int> &lhs, const pair<int,int> & rhs){
            return lhs.second>rhs.second;
        }
    };

priority_queue<pair<int,int>,vector<pair<int,int>>,mycmp> queue;

代码如下

class Solution {
    class mycmp{
        public:
        bool operator()(const pair<int,int> &lhs, const pair<int,int> & rhs){
            return lhs.second>rhs.second;
        }
    };
public:
    vector<int> topKFrequent(vector<int>& nums, int k) {
        unordered_map<int,int> map;
        for(int i =0;i<nums.size();i++){
                map[nums[i]]++;//统计频率
        }
        priority_queue<pair<int,int>,vector<pair<int,int>>,mycmp> queue;
        for(unordered_map<int,int>::iterator it = map.begin();it!=map.end();it++){
            queue.push(*it);
            if(queue.size()>k){//queue队列大于k 则将队首元素弹出
                queue.pop();
            }
        }
        vector<int> res;
        for(int i =0;i<k;i++){
            res.push_back(queue.top().first);
            queue.pop();
        }
        return res;
    }
};

执行用时:12 ms, 在所有 C++ 提交中击败了83.90%的用户

内存消耗:13.3 MB, 在所有 C++ 提交中击败了61.79%的用户

通过测试用例:21 / 21

你可能感兴趣的:(算法,leetcode,c++,算法,数据结构)