【剑斩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;
    }
};
相关推荐
练习时长一年1 小时前
LeetCode热题100(乘积最大子序列)
数据结构·算法·leetcode
仰泳的熊猫1 小时前
题目1109:Hanoi双塔问题
数据结构·c++·算法·蓝桥杯
AlenTech1 小时前
169. 多数元素 - 力扣(LeetCode)
算法·leetcode·职场和发展
橘颂TA1 小时前
【剑斩OFFER】算法的暴力美学——LeetCode 295 题:数据流的中位数
算法·结构与算法
闪电麦坤951 小时前
Leecode热题100:合并区间(数组)
数据结构·算法·leecode
VT.馒头2 小时前
【力扣】2631. 分组
javascript·算法·leetcode·typescript
永远都不秃头的程序员(互关)2 小时前
【K-Means深度探索(四)】速度与激情:MiniBatch K-Means如何驯服海量数据
算法·机器学习·kmeans
万象.2 小时前
redis数据结构hash的基本指令
数据结构·redis·哈希算法
世人万千丶2 小时前
鸿蒙跨端框架 Flutter 学习 Day 4:网络交互——HTTP 请求基础与数据反序列化实战
网络·学习·flutter·ui·交互·harmonyos·鸿蒙