【剑斩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;
    }
};
相关推荐
小O的算法实验室20 小时前
2026年ASOC,基于深度强化学习的无人机三维复杂环境分层自适应导航规划方法,深度解析+性能实测
算法·无人机·论文复现·智能算法·智能算法改进
为何创造硅基生物21 小时前
ESP32S3的RGB屏幕漂移问题
网络
好运的阿财21 小时前
process 工具与子agent管理机制详解
网络·人工智能·python·程序人生·ai编程
郭涤生21 小时前
STL vector 扩容机制与自定义内存分配器设计分析
c++·算法
周杰伦fans21 小时前
C# required 关键字详解
开发语言·网络·c#
༾冬瓜大侠༿21 小时前
vector
c语言·开发语言·数据结构·c++·算法
洛水水21 小时前
深入理解网络编程核心:Reactor、IOCP 与异步 IO 模型详解
网络·iocp
Ricky111zzz1 天前
leetcode学python记录1
python·算法·leetcode·职场和发展
汀、人工智能1 天前
[特殊字符] 第58课:两个正序数组的中位数
数据结构·算法·数据库架构··数据流·两个正序数组的中位数
liu****1 天前
第16届省赛蓝桥杯大赛C/C++大学B组(京津冀)
开发语言·数据结构·c++·算法·蓝桥杯