347. Top K Frequent Elements

Given an integer array nums and an integer k, return the k most frequent elements . You may return the answer in any order.

Example 1:

复制代码
Input: nums = [1,1,1,2,2,3], k = 2
Output: [1,2]

Example 2:

复制代码
Input: nums = [1], k = 1
Output: [1]

Constraints:

  • 1 <= nums.length <= 105
  • -104 <= nums[i] <= 104
  • k is in the range [1, the number of unique elements in the array].
  • It is guaranteed that the answer is unique.

Follow up: Your algorithm's time complexity must be better than O(n log n), where n is the array's size.

复制代码
class Solution {
public:
    class mycomparision{
    public://别忘记加上
        bool operator()(const pair<int,int>&lhs,const pair<int,int>& rhs){//重载()运算符
            return lhs.second>rhs.second;
        }
    };
    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>>,mycomparision>pri_que;
        //用固定大小为K的小顶堆扫描所有频率的大小
        for(unordered_map<int,int>::iterator it=map.begin();it!=map.end();it++){
            pri_que.push(*it);
            if(pri_que.size()>k){
                pri_que.pop();
            }
        }
        //找出前K个高频元素,由于小顶堆先弹出最小的,所以数组倒序,注意要从k-1开始
        vector<int> result(k);
        for (int i = k - 1; i >= 0; i--) {
            result[i] = pri_que.top().first;
            pri_que.pop();
        }
        return result;
    }
};
相关推荐
感哥4 小时前
C++ 多态
c++
沐怡旸11 小时前
【底层机制】std::string 解决的痛点?是什么?怎么实现的?怎么正确用?
c++·面试
NAGNIP11 小时前
大模型框架性能优化策略:延迟、吞吐量与成本权衡
算法
美团技术团队12 小时前
LongCat-Flash:如何使用 SGLang 部署美团 Agentic 模型
人工智能·算法
River41614 小时前
Javer 学 c++(十三):引用篇
c++·后端
感哥16 小时前
C++ std::set
c++
Fanxt_Ja17 小时前
【LeetCode】算法详解#15 ---环形链表II
数据结构·算法·leetcode·链表
侃侃_天下17 小时前
最终的信号类
开发语言·c++·算法
茉莉玫瑰花茶17 小时前
算法 --- 字符串
算法
博笙困了17 小时前
AcWing学习——差分
c++·算法