Conversation
| for (int i = 0; i < Math.min(k, nums1.length); i++) { | ||
| sumMinHeap.offer(new int[]{i, 0}); | ||
| } | ||
| while (!sumMinHeap.isEmpty() && result.size() < k) { |
There was a problem hiding this comment.
自分だったら、こう書くかなと思いました。
このwhile文が、resultという配列がサイズKになるまで、要素を追加する
というのが伝わりやすくなるためです。
また、sumMinHeapがemptyになるのは、異常系だと思うので、
if/breakにしたほうが読みやすいと思いました。
while (result.size() < k) {
if (sumMinHeap.isEmpty()) {
break
}
...省略
}
There was a problem hiding this comment.
ありがとうございます。たしかにこちらの方がわかりやすいですね。
| - ブルートフォースで全ペア分の配列を用意し、各ペアの合計値の heap に格納する | ||
| - result 用の配列に k 回分 heap から poll()して格納 |
There was a problem hiding this comment.
Javascriptでこの方法をとった際に、
Time Limit Errorが出て失敗していました。
スクリプト言語とコンパイラ言語の違いかもしれません。
There was a problem hiding this comment.
わかりづらくすみません。
その後、以下のようにブルートフォースで実装。書きながらだめそうと思ったがやはり Memory Limit Exceeded で動かなかった。
上記に記載のとおりこれも同じく動かなかったコードです。
| - ヒープの頂点を取り出し結果配列に追加する | ||
| - ポイントは、常に候補の中から最小のマスが探索対象となること。このため合理的な順で探索が進められる | ||
|
|
||
| - コメント: Python の tuple みたいな Pair というクラスが Java にあるのを初めて知った |
There was a problem hiding this comment.
調べたら、Java8までは標準で、その後外されたみたいです。
クラスを自作した方が無難そうですね。
|
|
||
| - [i, j]を[0, 0], [0, 1], [1, 1] と進めた後に[1, 0]に戻れない | ||
|
|
||
| - その後、以下のようにブルートフォースで実装。書きながらだめそうと思ったがやはり Memory Limit Exceeded で動かなかった。ブルートフォースはだいたいのケースで筋が悪いっぽい |
There was a problem hiding this comment.
空間計算量は求めましたか?また、空間計算量から、おおよそのメモリ使用量を求めましたか?
おおよそのメモリ使用量は、空間計算量を求めたあと、最大サイズを代入し、要素のおおよそのバイト数を掛けると出てきます。
There was a problem hiding this comment.
nums1.length=m、nums2.length=n とした場合、空間計算量は O(m·n) になりますね。
次にメモリ使用量の概算ですが、最悪ケースで m = n = 10^5 ⇒ m·n = 10^10 組 を保持します。
調べてみたところ、
Integer オブジェクト:16B → ペアで32B
よって、32B * 10 ^ 10 = 約320GB になります。現実的ではないことがよくわかりますね。。
| public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) { | ||
| List<List<Integer>> result = new ArrayList<>(); | ||
| if (nums1.length == 0 || nums2.length == 0 || k == 0) { | ||
| return result; |
There was a problem hiding this comment.
変数のスコープは短いほうがソースコードが読みやすくなる傾向があると思います。 result のスコープを短くするため、ここは new ArrayList<>() を返し、最後のループの直前で result を宣言するのはいかがでしょうか?
There was a problem hiding this comment.
なるほど、たしかにその方が見やすいですね。ありがとうございます。
問題
https://leetcode.com/problems/find-k-pairs-with-smallest-sums/
言語
Java
次に解く問題
Group Anagrams