【剑斩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;
    }
};
相关推荐
hans汉斯8 分钟前
【人工智能与机器人研究】基于分层控制的多智能体编队协同控制
网络·人工智能·学习·yolo·机器人
飞舞哲11 分钟前
三维点云最小二乘拟合MATLAB程序
开发语言·算法·matlab
Coder-magician18 分钟前
《代码随想录》刷题打卡day12:二叉树part02
数据结构·c++·算法
MIXLLRED25 分钟前
随笔——从“IP与网关不在同一网段”说起:网络连接故障的通用排查指南
网络·网络协议·tcp/ip
Safeploy安策数据27 分钟前
等保测评总卡壳?PCI加密卡如何破解政务云与金融合规难题
运维·网络·安全
海梨花33 分钟前
字节面试高频算法题
java·算法·面试·职场和发展
aqiu11111139 分钟前
python02
算法
瓦特what?39 分钟前
位运算核心技巧与应用
java·jvm·算法
无限码力39 分钟前
阿里算法岗 0530笔试真题 - 荆棘林的最优砍断计划
算法·阿里笔试真题·阿里机试真题·阿里算法岗笔试真题·阿里巴巴笔试真题
人道领域41 分钟前
【LeetCode刷题日记】90.子集Ⅱ--- 归纳题解
java·开发语言·leetcode