栈和队列-优先级队列/堆

题目链接:347. 前 K 个高频元素 - 力扣(LeetCode)

栈和队列-优先级队列/堆_第1张图片

// 时间复杂度:O(nlogk)
// 空间复杂度:O(n)
class Solution {
public:
    //使用小顶堆,将前面的pop,剩下的K个就是频率最高的k个
    //不使用大顶堆的原因是每次加入新元素时要将堆顶元素pop,则会将频率最高的元素pop

    //仿函数(Functor)
    //仿函数类都必须重载()运算符
    //例如下面的类,在对其进行实例化时调用其构造函数,此时就会执行重载后的()函数体
    //具体在优先级队列中时怎么执行的不看源码不清楚
    class mycomparison{//表示频率小的优先级大
    public:
        //为什么要重载()啊?不懂
        bool operator()(const pair &lhs, const pair &rhs){
            return lhs.second>rhs.second;
        }
    };
    vector topKFrequent(vector& nums, int k) {
        //统计每个元素的频率
        unordered_map map;
        for(int i=0;i,vector>,mycomparison> pri_que;
        //遍历map,将键值对放入优先级队列
        for(auto it:map)
        {
            pri_que.push(it);
            if(pri_que.size()>k)//保持优先级队列中始终为当前频率最高的前k个元素
            {
                pri_que.pop();
            }
        }

        //最后小顶堆中剩余的K个元素即频率最高的前k个元素
        vector res;
        while(!pri_que.empty())
        {
            res.push_back(pri_que.top().first);
            pri_que.pop();
        }
        return res;
    }
};

题目链接:692. 前K个高频单词 - 力扣(LeetCode)

栈和队列-优先级队列/堆_第2张图片

class Solution {
public:
    class mycomparison{
    public:
        bool operator()(const pair &l,const pair &r)
        {
            //按字典顺序是当两个频率相等时,对first进行排序
            //按字典顺序要倒序,因为这是小顶堆
            return l.second==r.second?l.firstr.second;
        }
    };
    vector topKFrequent(vector& words, int k) {
        //统计单词频率
        unordered_map m;
        for(auto str:words)
        {
            m[str]++;
        }

        //建立小顶堆
        priority_queue,vector>,mycomparison> smallTopPile;
        //遍历map,将其全部元素push进小顶堆
        for(auto it:m)
        {
            smallTopPile.push(it);
            if(smallTopPile.size()>k)//保证小顶堆中始终是前K个频率最高的元素
            {
                smallTopPile.pop();
            }
        }

        //这里注意,在输出结果时是要倒序输出的!
        vector res(k);
        int i=k-1;
        while(!smallTopPile.empty())
        {
            res[i]=smallTopPile.top().first;
            smallTopPile.pop();
            i--;
        }
        return res;
    }
};

你可能感兴趣的:(代码随想录,leetcode,算法,c++)