C++之TopK求解

TopK问题,就是找到一堆数据中最大/最小、出现频率最高等问题。现在想一下其实解决TopK问题的话,有一下几个想法:
1、直接各种排序,前提是内存足够的话,如果数据量极大,那就不太抗得住了。
2、最大最小堆。保留K个值,然后其他值与之比较,对最大/最小堆进行增加删除操作。
3、分治思想。把所有数据分成无数的k段,然后再合并不同的段称为新的k段,直到最后剩下一个段,即为所求。
4、hash法

下面就用实例来上手一下:

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

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

class Solution {
   
   
public:
    //此时要定义为静态函数,否则在类中无法直接调用
    static bool cmp(pair<int,int> m1,pair<int,int> m2)
        {
   
   
            return m1.second>m2.second;
        }

    vector<int> topKFrequent(vector<int>& nums, int k) {
   
   
        //用map来统计每个元素的个数
        map<int,int> m;
        for(int i=0;i<nums.size();i++)
        {
   
   
            m[nums[i]]++;
        } 
        //将每个map放入vector中(用迭代器),便于后续的按数量多少进行排序
        vector<pair<int,int>> v;
        map<int,int>::iterator it;
        for(it=m.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值