【剑斩OFFER】算法的暴力美学——力扣 692 题:前 K 个高频单词

一、题目描述

二、算法原理

思路:建立 k 个节点的小根堆

原因:通过不断的入让数据入堆,导致大的数据沉底,如果节点大于 k 个,把堆顶的数据出堆,此时出的就是小的值,不断出,不断的入,导致最后留在堆的元素是前 k 个大的数据;

注意:堆的比较函数要特殊处理,当两个字符串的长度一样时,让ASCLL的值大的入堆;由于大的值沉底,所以我们的结果是逆序的;

三、代码示例

cpp 复制代码
struct Compare
{
public:
    bool operator()(const pair<string,int>& x,const pair<string,int>& y)//比较函数
    {
        if(x.second == y.second) 
        {
            return x.first < y.first;
        }
        else
        {
            return x.second > y.second;
        }
    }
};
class Solution {
public:
    vector<string> topKFrequent(vector<string>& words, int k) {
        //处理频次
        unordered_map<string,int> hash;
        for(auto& ch : words) hash[ch]++;

        //实现堆
        priority_queue<pair<string,int>,vector<pair<string,int>>,Compare> mer;

        //维护堆的 K 个节点
        for(auto& e : hash)
        {
            mer.push(e);
            if(mer.size() > k)
            {
                mer.pop();
            }
        }

        //从堆中拿出 k 个节点
        vector<string> ret;
        ret.resize(mer.size());
        for(int i = ret.size() - 1 ; i >= 0; i--)//因为这个堆是小根堆,所以堆顶是小值,所以要逆序放置
        {
            ret[i] = mer.top().first;
            mer.pop();
        }
        return ret;
    }
};
相关推荐
无极低码3 小时前
ecGlypher新手安装分步指南(标准化流程)
人工智能·算法·自然语言处理·大模型·rag
软件算法开发3 小时前
基于海象优化算法的LSTM网络模型(WOA-LSTM)的一维时间序列预测matlab仿真
算法·matlab·lstm·一维时间序列预测·woa-lstm·海象优化
superior tigre4 小时前
22 括号生成
算法·深度优先
努力也学不会java5 小时前
【缓存算法】一篇文章带你彻底搞懂面试高频题LRU/LFU
java·数据结构·人工智能·算法·缓存·面试
旖-旎5 小时前
二分查找(x的平方根)(4)
c++·算法·二分查找·力扣·双指针
ECT-OS-JiuHuaShan5 小时前
朱梁万有递归元定理,重构《易经》
算法·重构
05大叔6 小时前
网络基础知识 域名,JSON格式,AI基础
运维·服务器·网络
智者知已应修善业6 小时前
【51单片机独立按键控制数码管移动反向,2片74CH573/74CH273段和位,按键按下保持原状态】2023-3-25
经验分享·笔记·单片机·嵌入式硬件·算法·51单片机
我想走路带风6 小时前
c++工具转向网络底层工具
网络