2026/4/18 18:16:59
网站建设
项目流程
网站建设案例价格,微信小程序开发商家,沧州手机端网络推广,企业文化墙设计网站推荐一、题目描述 二、算法原理
思路#xff1a;建立 k 个节点的小根堆 原因#xff1a;通过不断的入让数据入堆#xff0c;导致大的数据沉底#xff0c;如果节点大于 k 个#xff0c;把堆顶的数据出堆#xff0c;此时出的就是小的值#xff0c;不断出#xff0c;不断的入…一、题目描述二、算法原理思路建立 k 个节点的小根堆原因通过不断的入让数据入堆导致大的数据沉底如果节点大于 k 个把堆顶的数据出堆此时出的就是小的值不断出不断的入导致最后留在堆的元素是前 k 个大的数据注意堆的比较函数要特殊处理当两个字符串的长度一样时让ASCLL的值大的入堆由于大的值沉底所以我们的结果是逆序的三、代码示例struct Compare { public: bool operator()(const pairstring,int x,const pairstring,int y)//比较函数 { if(x.second y.second) { return x.first y.first; } else { return x.second y.second; } } }; class Solution { public: vectorstring topKFrequent(vectorstring words, int k) { //处理频次 unordered_mapstring,int hash; for(auto ch : words) hash[ch]; //实现堆 priority_queuepairstring,int,vectorpairstring,int,Compare mer; //维护堆的 K 个节点 for(auto e : hash) { mer.push(e); if(mer.size() k) { mer.pop(); } } //从堆中拿出 k 个节点 vectorstring ret; ret.resize(mer.size()); for(int i ret.size() - 1 ; i 0; i--)//因为这个堆是小根堆所以堆顶是小值所以要逆序放置 { ret[i] mer.top().first; mer.pop(); } return ret; } };