91 前K个高频元素

前K个高频元素

    • 题解1 大根堆(STL)

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

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

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

提示:

  • 1 <= nums.length <= 1 0 5 10^5 105
  • k 的取值范围是 [1, 数组中不相同的元素的个数]
  • 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的

进阶:你所设计算法的时间复杂度 必须 优于 O ( n l o g n ) O(n log n) O(nlogn) ,其中 n 是数组大小。

题解1 大根堆(STL)

class Solution {
public:
	// 定义pair比较规则 
    struct cmp {
        bool operator()(const pair<int, int>& a, const pair<int, int>& b){
        return a.second > b.second;
        }
    };
    /** 或者
    // 解释一下为什么用static:传入的函数指针为void类型,如果不是static会默认带this指针,这样与void类型不匹配
    static bool cmp(pair& m, pair& n) {
        return m.second > n.second;
    }
    **/
    
    vector<int> topKFrequent(vector<int>& nums, int k) {
        priority_queue<pair<int, int>, vector<pair<int, int>>, cmp> pq;
        map<int, int> ff;
        vector<int> ret(k);
        // 记次数(也可以先排序)
        for(auto& i : nums){
            ff[i] ++;
        }
        // 同前K个最大值(只不过这次是比次数)
        for(auto& i : ff){
            pq.push(make_pair(i.first, i.second));
            if(pq.size() > k)
                pq.pop();
        }
		// 放回ret
        for(int i = 0; i < k; i++){
            ret[i] = pq.top().first;
            pq.pop();
        }
        return ret;

    }
};

91 前K个高频元素_第1张图片

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