トピック:
https://leetcode-cn.com/problems/top-k-frequent-words/
言葉の非空のリストに、kは単語が戻る前に、最大で表示された回数です。
答えは、周波数ワードが表示され降順にソート返されるべきです。同じ単語が異なる周波数を有する場合には、アルファベット順にソート。
例1:
入力:[ "I"、 "愛 "、 "leetcode"、 "I"、 "愛"、 "コーディング"]で、k = 2
出力:[ "I"、 "愛 "]
分析: "I"と「愛二つの言葉は、最も頻繁に現れるよう」、2回です。
注、「I」「愛」の前にアルファベット順でいます。
例2:
入力:[ ""、 "日 = 4、K"、 "ある"、 "晴れ"、 ""、 ""、 ""、 "晴れ"、 "である"とは、 "ある"]
出力:[ 、「ある」「」、 「晴れ」、「日」]
解決:「」、「ある」 「晴れ」、 および「日」4つの単語が最も頻繁に表示され、
出現数は4、3でした、 2と1。
注意:
Kは、全RMS、1つの≤K≤要素の集合数を想定しています。
小文字で入力された単語。
問題解決のためのアイデア
- Pythonは最小ヒープheapqを実現しています
- heapq.nlargest heapq関数)(反復可能[キー]、N)がトップkを取り
- 機能上の3番目の引数は、マルチパラメータが比較CASCADEサポート
- ()、周波数下降と上昇の名前を満たすことができない直接nlargest
- )(数、及びその後nsmallest使用する変換 - トリック前周波数を追加することです
コード
class Solution:
def topKFrequent(self, words: List[str], k: int) -> List[str]:
# - statistic word frequency
freq_dict = {}
for w in words:
if w not in freq_dict:
freq_dict[w] = 0
freq_dict[w] += 1
# - top k, sort by -freq and word
return heapq.nsmallest(k, freq_dict, key=lambda w:(-freq_dict[w], w))
ご注意ください
- heapqは、厳密に言えば、日和見属し使用し、必要が捜査の目的を達成するために、独自のnsmallest()を実装します
- より一般的なアプローチは、上位k個の並べ替えを達成するために、基準クイックステップを分割することです