leetcode0347. 前 K 个高频元素-medium

1 题目:前 K 个高频元素

官方标定难度:中

给你一个整数数组 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 log n) ,其中 n 是数组大小。

2 solution

如果直接排序,然后最大的 k 个即可,但是这不满足进阶的要求。可以用 k 次取最小值,klogn

代码

class Solution {
public:
vector<int> topKFrequent(vector<int> &nums, int k) {
    unordered_map<int, int> cnt;
    for (int i: nums) {
        cnt[i]++;
    }

    auto f = [&](int a, int b) { return cnt[a] < cnt[b]; };
    priority_queue<int, vector<int>, decltype(f)> pq(f);
    
    for(auto p : cnt){
        pq.push(p.first);
    }

    vector<int> res(k);
    for(int i = 0; i < k; i++){
        res[i] = pq.top();
        pq.pop();
    }
    return res;
}

};

结果

leetcode0347. 前 K 个高频元素-medium_第1张图片

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