C++实现LeetCode(692.前K个高频词)_第1页
C++实现LeetCode(692.前K个高频词)_第2页
C++实现LeetCode(692.前K个高频词)_第3页
C++实现LeetCode(692.前K个高频词)_第4页
C++实现LeetCode(692.前K个高频词)_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论