LeetCode 347 前K个高频元素 HERODING的LeetCode之路

给定一个非空的整数数组,返回其中出现频率前 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 个高频元素的集合是唯一的。
你可以按任意顺序返回答案。

解题思路:
该题的限定条件要求算法的效率一定要高,所以这里使用特殊的数据结构,一个是unordered_map,它可以更高效的存储key、value数据并查找,这样我们输入的数据就直接存储到key、value中,相同的key那么value++,这样实现了输入的数字的统计,第二个用到的是priority_queue,这个优先队列实按照一定的规律进行排列,可以自己设定,代码如下:

class Solution {
public:
    vector<int> topKFrequent(vector<int>& nums, int k) {
        vector<int> res;
        unordered_map<int, int> map;
        priority_queue<pair<int, int>> q;
        for(auto i : nums){
            map[i] ++;//相当于给对应的key的value计数
        }
        for(auto j : map){
            q.push(pair<int, int>(-j.second, j.first));//规则:先判断后面的数目,再判断前者
            if(q.size() > k){//如果超过了K个要丢弃
                q.pop();
            }
        }
        while(k --){
            res.push_back(q.top().second);
            q.pop();
        }
        return res;
    }
};

猜你喜欢

转载自blog.csdn.net/HERODING23/article/details/108451824