




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第C++實(shí)現(xiàn)LeetCode(692.前K個(gè)高頻詞)[LeetCode]692.TopKFrequentWords前K個(gè)高頻詞
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個(gè)高頻詞,跟之前那道題TopKFrequentElements極其類似,換了個(gè)數(shù)據(jù)類型就又是一道新題。唯一的不同就是之前那道題對(duì)于出現(xiàn)頻率相同的數(shù)字,沒有順序要求。而這道題對(duì)于出現(xiàn)頻率相同的單詞,需要按照字母順序來排。但是解法都一樣,還是用最小堆和桶排序的方法。首先來看最小堆的方法,思路是先建立每個(gè)單詞和其出現(xiàn)次數(shù)之間的映射,然后把單詞和頻率的pair放進(jìn)最小堆,如果沒有相同頻率的單詞排序要求,我們完全可以讓頻率當(dāng)作pair的第一項(xiàng),這樣priority_queue默認(rèn)是以pair的第一項(xiàng)為key進(jìn)行從大到小的排序,而當(dāng)?shù)谝豁?xiàng)相等時(shí),又會(huì)以第二項(xiàng)由大到小進(jìn)行排序,這樣第一項(xiàng)的排序方式就與題目要求的相同頻率的單詞要按字母順序排列不相符,當(dāng)然我們可以在存入結(jié)果res時(shí)對(duì)相同頻率的詞進(jìn)行重新排序處理,也可以對(duì)priority_queue的排序機(jī)制進(jìn)行自定義,這里我們采用第二種方法,我們自定義排序機(jī)制,我們讓a.secondb.second,讓小頻率的詞在第一位,然后當(dāng)a.second==b.second時(shí),我們讓a.firstb.first,這是讓字母順序大的排在前面(這里博主需要強(qiáng)調(diào)一點(diǎn)的是,priority_queue的排序機(jī)制的寫法和vector的sort的排序機(jī)制的寫法正好順序相反,同樣的寫法,用在sort里面就是頻率小的在前面,不信的話可以自己試一下)。定義好最小堆后,我們首先統(tǒng)計(jì)單詞的出現(xiàn)頻率,然后組成pair排序最小堆之中,我們只保存k個(gè)pair,超過了就把隊(duì)首的pair移除隊(duì)列,最后我們把單詞放入結(jié)果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,來建立次數(shù)和出現(xiàn)該次數(shù)所有單詞的集合set之間的映射,這里也利用了set能自動(dòng)排序的特性,當(dāng)然我們還是需要首先建立每個(gè)單詞和其出現(xiàn)次數(shù)的映射,然后將其組成pair放入map種,map是從小到大排序的,這樣我們從最后面取pair,就是次數(shù)最大的,每次取出一層中所有的單詞,如果此時(shí)的k大于該層的單詞個(gè)數(shù),就將整層的單詞加入結(jié)果res中,否則就取前K個(gè)就行了,取完要更更新K值,如果K小于等于0了,就break掉,返回結(jié)果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;
};
下面這種解法是一種桶排序的思路,我們根據(jù)出現(xiàn)次數(shù)建立多個(gè)bucket,桶的個(gè)數(shù)不會(huì)超過單詞的個(gè)數(shù),在每個(gè)桶中,我們對(duì)單詞按字符順序進(jìn)行排序。我們可以用個(gè)數(shù)組來表示桶,每一層中放一個(gè)集合,利用set的自動(dòng)排序的功能,使其能按字母順序排列。我們還是需要首先建立每個(gè)單詞和其出現(xiàn)次數(shù)的映射,然后將其組成pair放入map種,map是從小到大排序的,這樣我們倒序遍歷所有的桶,這樣取pair,就是次數(shù)最大的,每次取出一層中所有的單詞,如果此時(shí)的k大于該層的單詞個(gè)數(shù),就將整層的單詞加入結(jié)果res中,否則就取前K個(gè)就行了,取完要更更新K值,如果K小于等于0了,就break掉,返回結(jié)果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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 客戶購房合同管理制度
- 壓鑄加工安全管理制度
- 切實(shí)可行的2025年行政組織理論試題及答案
- 危險(xiǎn)作業(yè)日常管理制度
- 展廳工地現(xiàn)場(chǎng)管理制度
- 吉林大學(xué)本科管理制度
- 大廳疫情防控管理制度
- 婦產(chǎn)醫(yī)院分娩管理制度
- 行政組織的透明治理與網(wǎng)絡(luò)時(shí)代探討試題及答案
- 廠區(qū)草坪綠化管理制度
- C919飛機(jī)首飛試飛機(jī)組培訓(xùn)-指示記錄
- 社保費(fèi)扣費(fèi)協(xié)議書范文范本下載
- 2024屆清華大學(xué)強(qiáng)基計(jì)劃數(shù)學(xué)學(xué)科筆試試題(附答案)
- 正規(guī)個(gè)人租車合同模板
- 【一等獎(jiǎng)?wù)n件】《刑事攝像技術(shù)》比賽課題:現(xiàn)場(chǎng)照相內(nèi)容及方法
- 《地方導(dǎo)游基礎(chǔ)知識(shí)》8.1 港澳臺(tái) 地方導(dǎo)游基礎(chǔ)知識(shí)-題庫及答案
- 2022年版信息科技新課標(biāo)《義務(wù)教育信息科技課程標(biāo)準(zhǔn)(2022年版)》解讀課件
- 卷紙有多長(zhǎng)(教學(xué)設(shè)計(jì))-2023-2024學(xué)年六年級(jí)下冊(cè)數(shù)學(xué)北師大版
- VDA6.3 2023 過程審核檢查表-參考表單
- 大象版小學(xué)科學(xué)三年級(jí)下冊(cè)科學(xué)全冊(cè)教案
- 數(shù)據(jù)庫原理英文選擇題
評(píng)論
0/150
提交評(píng)論