




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第C++实现LeetCode(692.前K个高频词)[LeetCode]692.TopKFrequentWords前K个高频词
Givenanon-emptylistofwords,returnthekmostfrequentelements.
Youranswershouldbesortedbyfrequencyfromhighesttolowest.Iftwowordshavethesamefrequency,thenthewordwiththeloweralphabeticalordercomesfirst.
Example1:
Input:["i","love","leetcode","i","love","coding"],k=2
Output:["i","love"]
Explanation:"i"and"love"arethetwomostfrequentwords.
Notethat"i"comesbefore"love"duetoaloweralphabeticalorder.
Example2:
Input:["the","day","is","sunny","the","the","the","sunny","is","is"],k=4
Output:["the","is","sunny","day"]
Explanation:"the","is","sunny"and"day"arethefourmostfrequentwords,
withthenumberofoccurrencebeing4,3,2and1respectively.
Note:
Youmayassumekisalwaysvalid,1≤k≤numberofuniqueelements.
Inputwordscontainonlylowercaseletters.
Followup:
TrytosolveitinO(nlogk)timeandO(n)extraspace.
CanyousolveitinO(n)timewithonlyO(k)extraspace
这道题让我们求前K个高频词,跟之前那道题TopKFrequentElements极其类似,换了个数据类型就又是一道新题。唯一的不同就是之前那道题对于出现频率相同的数字,没有顺序要求。而这道题对于出现频率相同的单词,需要按照字母顺序来排。但是解法都一样,还是用最小堆和桶排序的方法。首先来看最小堆的方法,思路是先建立每个单词和其出现次数之间的映射,然后把单词和频率的pair放进最小堆,如果没有相同频率的单词排序要求,我们完全可以让频率当作pair的第一项,这样priority_queue默认是以pair的第一项为key进行从大到小的排序,而当第一项相等时,又会以第二项由大到小进行排序,这样第一项的排序方式就与题目要求的相同频率的单词要按字母顺序排列不相符,当然我们可以在存入结果res时对相同频率的词进行重新排序处理,也可以对priority_queue的排序机制进行自定义,这里我们采用第二种方法,我们自定义排序机制,我们让a.secondb.second,让小频率的词在第一位,然后当a.second==b.second时,我们让a.firstb.first,这是让字母顺序大的排在前面(这里博主需要强调一点的是,priority_queue的排序机制的写法和vector的sort的排序机制的写法正好顺序相反,同样的写法,用在sort里面就是频率小的在前面,不信的话可以自己试一下)。定义好最小堆后,我们首先统计单词的出现频率,然后组成pair排序最小堆之中,我们只保存k个pair,超过了就把队首的pair移除队列,最后我们把单词放入结果res中即可,参见代码如下:
解法一:
classSolution{
public:
vectorstringtopKFrequent(vectorstringwords,intk){
vectorstringres(k);
unordered_mapstring,intfreq;
autocmp=[](pairstring,inta,pairstring,intb){
returna.secondb.second||(a.second==b.seconda.firstb.first);
priority_queuepairstring,int,vectorpairstring,int,decltype(cmp)q(cmp);
for(autoword:words)++freq[word];
for(autof:freq){
q.push(f);
if(q.size()k)q.pop();
for(inti=res.size()-1;i--i){
res[i]=q.top().first;q.pop();
returnres;
};
下面这种解法还是一种堆排序的思路,这里我们用map,来建立次数和出现该次数所有单词的集合set之间的映射,这里也利用了set能自动排序的特性,当然我们还是需要首先建立每个单词和其出现次数的映射,然后将其组成pair放入map种,map是从小到大排序的,这样我们从最后面取pair,就是次数最大的,每次取出一层中所有的单词,如果此时的k大于该层的单词个数,就将整层的单词加入结果res中,否则就取前K个就行了,取完要更更新K值,如果K小于等于0了,就break掉,返回结果res即可,参见代码如下:
解法二:
classSolution{
public:
vectorstringtopKFrequent(vectorstringwords,intk){
vectorstringres;
unordered_mapstring,intfreq;
mapint,setstringm;
for(stringword:words)++freq[word];
for(autoa:freq){
m[a.second].insert(a.first);
for(autoit=m.rbegin();it!=m.rend();++it){
if(k=0)break;
autot=it-second;
vectorstringv(t.begin(),t.end());
if(k=t.size()){
res.insert(res.end(),v.begin(),v.end());
}else{
res.insert(res.end(),v.begin(),v.begin()+k);
k-=t.size();
returnres;
};
下面这种解法是一种桶排序的思路,我们根据出现次数建立多个bucket,桶的个数不会超过单词的个数,在每个桶中,我们对单词按字符顺序进行排序。我们可以用个数组来表示桶,每一层中放一个集合,利用set的自动排序的功能,使其能按字母顺序排列。我们还是需要首先建立每个单词和其出现次数的映射,然后将其组成pair放入map种,map是从小到大排序的,这样我们倒序遍历所有的桶,这样取pair,就是次数最大的,每次取出一层中所有的单词,如果此时的k大于该层的单词个数,就将整层的单词加入结果res中,否则就取前K个就行了,取完要更更新K值,如果K小于等于0了,就break掉,返回结果res即可,参见代码如下:
解法三:
classSolution{
public:
vectorstringtopKFrequent(vectorstringwords,intk){
vectorstringres;
unordered_mapstring,intfreq;
vectorsetstringv(words.size()+1,setstring
for(stringword:words)++freq[word];
for(autoa:freq){
v[a.second].insert(a.first);
for(inti=v.size()-1;i--i){
if(k=0)break;
vectorstringt(v[i].begin(),v[i].end());
if(k=t.size()){
res.insert(res.end(),t.begin(),t.end());
}else{
res.insert(res.end(),t.begin(),t.begin()+k);
k-=t.size();
returnres
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025至2030中国机械电子智能锁行业消费趋势及竞争策略研究报告
- 2025年免疫治疗突破:针对自身免疫性疾病的创新治疗方案分析报告
- 2025至2030中国数字线性振动器行业发展动态与应用趋势研究报告
- 2025至2030中国奶茶机市场销售渠道及发展前景前景研究报告
- 2025年农业科技成果转化与农业产业融合发展案例报告
- 2025至2030中国坚果电商产业经营模式及竞争格局研究报告
- 2025至2030中国四冲程汽油发动机行业深度调研及运行态势研判报告
- 2025至2030中国原料药碳酸氢钠行业发展趋势及前景动态研究报告
- 企业战略实施中的反馈机制试题及答案
- 法学概论的学习策略和误区控制与试题与答案
- DB23T 3844-2024 煤矿地区地震(矿震)监测台网技术要求
- 工商企业管理毕业论文范文(4篇)
- 卷纸有多长(教学设计)-2023-2024学年六年级下册数学北师大版
- 浙江省宁波市2024年小升初英语试卷(含答案)2
- 1.2 匀变速直线运动-医药卫生类
- 3.2 推动高质量发展 课件高中政治统编版必修二经济与社会
- 《太阳升起来了》课件
- 2024年湖北高考化学真题试题(原卷版+含解析)
- 住院成人高血糖患者血糖监测医护协议处方共识
- 汽车清洁保养服务合同示范文本
- 《市场营销:网络时代的超越竞争》第4版 课件 第8章 制定有效的价格策略
评论
0/150
提交评论