LeetCode347. 前 K 个高频元素 | 刷题打卡

124 阅读1分钟

LeetCode从低效到高效,点击

一、题目描述:

题目要求

给定一个非空的整数数组,返回其中出现频率前 k 高的元素。

来源:力扣(LeetCode)链接

示例

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

二、思路分析:

本题是215. 数组中的第K个最大元素的变形,本题要求返回的是出现频率前K高的元素。 首先我们需要排序的不是元素本身,而是元素出现的频率,那么首先想到的存储结构就是哈希表的结构<元素,频率>,之后对频率的第k个就回到了215题,这里为了代码少写几行考虑就使用的小根堆的方案,也可以根据215的代码写快排+二分的版本。

三、AC 代码:

先放到哈希表里,再放到小根堆里

// great -> 小根堆 -> 剩下的都是大的
class paircomp{
public:
    bool operator()(const pair<int,int> l,const pair<int,int> r){
        return l.second>r.second;
    }
};
// 12 ms  13.3 MB
vector<int> topKFrequent(vector<int>& nums, int k) {
    // key是数值,value是出现的频次
    unordered_map<int,int> occur;
    for(auto v:nums){
        occur[v]++;
    }
    // 使用堆排序或者快速查找+二分的思路(215题这两种思路都有)
    // 到这一步就回到了求前k个的问题了 只不过结构不同
    priority_queue<pair<int,int>,vector<pair<int,int>>,paircomp> pq;
    
    for(auto it=occur.begin();it!=occur.end();it++){
        pq.emplace(*it);
        if(pq.size()>k){
            pq.pop();
        }
    }
    vector<int> out(k);
    for(int i=k-1;i>=0;i--){
        out[i] = pq.top().first;
        pq.pop();
    }
    return out;
}

四、总结:

注意小根堆的判断条件是选大的哪个,仿函数的写法要注意。

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情