373. Find K Pairs with Smallest Sums - #54
Conversation
|
|
||
| return flatten_pairs[:k] | ||
| ``` | ||
| - 制約上 `nums1`, `nums2` はそれぞれ最大 $10^{5}$ 個の要素を持ちうるため、最悪ケースでは $10^{10}$ 個の組をメモリに保持しようとすることになる |
There was a problem hiding this comment.
この場合、両方ソート済みという情報を使えるので、num1, num2 を (i,j) マス状に並べた
これを左上 (0,0) からマスの右と下(マスの値は行と列の和)を比較し続けて、和が小さい方の組をメモに残し続けた結果が答えになる、という手順ですかね。
| heapq.heappush(candidates, (nums1[i] + nums2[0], i, 0)) | ||
|
|
||
| pairs = [] | ||
| while candidates is not None and len(pairs) < k: |
There was a problem hiding this comment.
step2と比較して, is not None が追加されていますが,これはなくてもよいように感じました.
意図があれば教えて欲しいです.
There was a problem hiding this comment.
Truthy/Falsyな値の評価であることを強調する意図を込めています。
ksaito0629/leetcode_arai60#1 (comment) のコメントにあるように、 Google Python Style Guideline を参考にしました。
|
|
||
| ## Step3 | ||
| ```py | ||
| class Solution: |
There was a problem hiding this comment.
興味本位なのですが、step2 で多くの解法を見た上でこの解法を選択した理由は何になりますでしょうか?
みた感じ、len(nums1) が小さく、len(nums2)がかなり大きい場合とかに適している解法なのかなとは思ったのですが。
There was a problem hiding this comment.
意図は主に2つあって、ヒープの練習をしたかったというのと、ご指摘の点で有利だからという点ですね。
| ## Step1 | ||
| ### 方針 | ||
| - `num1`, `num2` は昇順であることが保証されているため、 `347. Top K Frequent Elements` とほぼ同じ方針で解いてみる | ||
| - MLEになる。後ろの方の組はどう考えても不要だなと思いつつも、この時点で20分経過していたため正答を見る |
There was a problem hiding this comment.
コードを書く前に空間計算量を求め、おおよそのメモリ使用量を求めることをお勧めいたします。おおよそのメモリ使用量は、空間計算量に入力データサイズの上限を代入し、 1 要素当たりのバイト数を掛けると求められます。 1 要素当たりのバイト数は、 sys.getsizeof() で調べることができます。ぜひ試してみて下さい。
There was a problem hiding this comment.
LeetCode上で sys.getsizeof(num) を実行したところ、リスト1要素当たりのバイト数は28バイトでした。
373. Find K Pairs with Smallest Sums
次回予告: 560. Subarray Sum Equals K