C++實現(xiàn)LeetCode(692.前K個高頻詞)_第1頁
C++實現(xiàn)LeetCode(692.前K個高頻詞)_第2頁
C++實現(xiàn)LeetCode(692.前K個高頻詞)_第3頁
C++實現(xiàn)LeetCode(692.前K個高頻詞)_第4頁
C++實現(xiàn)LeetCode(692.前K個高頻詞)_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第C++實現(xiàn)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極其類似,換了個數(shù)據(jù)類型就又是一道新題。唯一的不同就是之前那道題對于出現(xiàn)頻率相同的數(shù)字,沒有順序要求。而這道題對于出現(xiàn)頻率相同的單詞,需要按照字母順序來排。但是解法都一樣,還是用最小堆和桶排序的方法。首先來看最小堆的方法,思路是先建立每個單詞和其出現(xiàn)次數(shù)之間的映射,然后把單詞和頻率的pair放進最小堆,如果沒有相同頻率的單詞排序要求,我們完全可以讓頻率當(dāng)作pair的第一項,這樣priority_queue默認是以pair的第一項為key進行從大到小的排序,而當(dāng)?shù)谝豁椣嗟葧r,又會以第二項由大到小進行排序,這樣第一項的排序方式就與題目要求的相同頻率的單詞要按字母順序排列不相符,當(dāng)然我們可以在存入結(jié)果res時對相同頻率的詞進行重新排序處理,也可以對priority_queue的排序機制進行自定義,這里我們采用第二種方法,我們自定義排序機制,我們讓a.secondb.second,讓小頻率的詞在第一位,然后當(dāng)a.second==b.second時,我們讓a.firstb.first,這是讓字母順序大的排在前面(這里博主需要強調(diào)一點的是,priority_queue的排序機制的寫法和vector的sort的排序機制的寫法正好順序相反,同樣的寫法,用在sort里面就是頻率小的在前面,不信的話可以自己試一下)。定義好最小堆后,我們首先統(tǒng)計單詞的出現(xiàn)頻率,然后組成pair排序最小堆之中,我們只保存k個pair,超過了就把隊首的pair移除隊列,最后我們把單詞放入結(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)然我們還是需要首先建立每個單詞和其出現(xiàn)次數(shù)的映射,然后將其組成pair放入map種,map是從小到大排序的,這樣我們從最后面取pair,就是次數(shù)最大的,每次取出一層中所有的單詞,如果此時的k大于該層的單詞個數(shù),就將整層的單詞加入結(jié)果res中,否則就取前K個就行了,取完要更更新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ù)建立多個bucket,桶的個數(shù)不會超過單詞的個數(shù),在每個桶中,我們對單詞按字符順序進行排序。我們可以用個數(shù)組來表示桶,每一層中放一個集合,利用set的自動排序的功能,使其能按字母順序排列。我們還是需要首先建立每個單詞和其出現(xiàn)次數(shù)的映射,然后將其組成pair放入map種,map是從小到大排序的,這樣我們倒序遍歷所有的桶,這樣取pair,就是次數(shù)最大的,每次取出一層中所有的單詞,如果此時的k大于該層的單詞個數(shù),就將整層的單詞加入結(jié)果res中,否則就取前K個就行了,取完要更更新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等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論