347. Top K Frequent Elements - #9
Conversation
| num_to_frequency[num] = 1 | ||
| num_to_frequency_ordered_by_desc = dict(sorted(num_to_frequency.items(), key=lambda item: item[1], reverse=True)) | ||
| return list(num_to_frequency_ordered_by_desc)[:k] | ||
| ``` |
There was a problem hiding this comment.
sorted()をもとにreturnするとすっきりすると思います。
num_to_frequency_ordered_by_desc = sorted(num_to_frequency.items(), key=lambda item: item[1], reverse=True)
return [num for num, _ in num_to_frequency_ordered_by_desc[:k]]There was a problem hiding this comment.
ありがとうございます!
確かにスッキリしました。余計な dict を消すことができたので、num_to_frequency.items() の num を使うという意図がよりはっきり表現できるようになった感じがあります。
49a93eb
There was a problem hiding this comment.
sorted(num_to_frequency, key=num_to_frequency.get, reverse=True)[:k]
みたいなのは一応ありますね。
sorted は iterable を取るので、dict を入れると dict key がソートされます。
There was a problem hiding this comment.
こう書けるのですね。
https://discord.com/channels/1084280443945353267/1201211204547383386/1207251531041210408
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
num_to_frequency = defaultdict(int)
for num in nums:
num_to_frequency[num] += 1
return sorted(num_to_frequency, key=num_to_frequency.get, reverse=True)[:k]この dict key の配列を sort して返すという方が、tuple の解法よりも寄り道しないで解いている感じがあり、個人的には好みです。ご教示いただき、ありがとうございます。
| - Step 3: 全部消して、10 分以内にエラーを一度も出さずに正解するのを 3 回続けて行う。 | ||
| - Step 4: いただいたレビューをもとに、コードを整える。 | ||
|
|
||
| なお、[oda さんの提案](https://discord.com/channels/1084280443945353267/1366778718705553520/1450943270799671337)を参考に、コードを書く部分にフォーカスして Arai60 を1周しています。今回は2周目に当たります。 |
There was a problem hiding this comment.
はい、明確に変わったと感じます。
1周目の時点ではアルゴリズムほぼ初心者みたいな感じだったので周りを見るのにかなり時間がかかってしまっており余裕もありませんでしたが、2周目になって色んな人のコメントを見るのに前ほど時間をかけなくても良くなり余裕が出てきた感じがあります。解法をただ覚えるのではなく、それぞれの解法を抽象化して理解するのに慣れたからなのではないかなと考えています。
もちろんまだまだ周りを見るのに時間はかかるので精進しないとですが、、
|
|
||
| - 各数字と頻度の dict を作成し、その dict を頻度の降順で sort したのちに、上から k 個の keys の配列を返すもの。 | ||
| - 時間計算量: O(n), 空間計算量: O(n) | ||
| - これはこれでスッキリしている気はするが、`その dict を頻度の降順で sort したのちに`の部分のコードがちょっと強引感があるなー。命名は最大限わかりやすくしたつもりだが、それでもワーっとやりたいことをその1行に凝縮している感じがあって、あんまり好きではない。 |
There was a problem hiding this comment.
やや手順増えますが一度 [(freq, num), ...] というタプルのリストにしてからソートしてそのあと num だけ取り出すとかもあり得ますかね?
frequency_and_nums = [(frequency, num) for num, frequency in num_to_frequency.items()]There was a problem hiding this comment.
ありがとうございます!
確かにその方が記述量が減って、やりたいことがより明確に表現できる感じがあって良いですね!
step 4 として追加しました。
49a93eb
https://leetcode.com/problems/top-k-frequent-elements/description/
Next: https://leetcode.com/problems/find-k-pairs-with-smallest-sums/description/