Conversation
| - `numToIndex.get()`した値をnullチェックするより、`numToIndex.containsKey()`する方が読み手にとって親切だろうか | ||
| - hashの計算を2回するのがもったいないように感じて最初から`get()`する形で書いた |
There was a problem hiding this comment.
大前提として場合によりけりだとは思いますが、個人的には計算時間の最適化と可読性のトレードオフになった場合は可読性を優先したほうがよいのではないかと考えます。
ドナルド・クヌースは早すぎる最適化は諸悪の根源であると述べたようです。
またパフォーマンスチューニングにおいては「推測するな、計測せよ」という有名な格言もあります。
もしパフォーマンスを気にされるのであればベンチマークを取るなどの計測を行った上で読みやすさより速度を優先した、という決定をされるのがよいのかなと思います。
There was a problem hiding this comment.
仰る通りです。また現実問題、ここで時間をケチったところで問題が解決することは無さそうなのでちょっと余計でした。
| Map<Integer, Integer> numToIndex = new HashMap<>(); | ||
| for(int i = 0; i < nums.length; i++) { | ||
| int num = nums[i]; | ||
| int partnerNum = target - num; |
There was a problem hiding this comment.
分かりづらいわけではないですが、個人的には上で述べられているcomplementなどのほうがより分かりやすい気がしました。
| ``` | ||
| - hashMapを使った実装において処理の流れは一緒だが以下のような書き方も想定できたらよかった | ||
| - ターゲットとある値の差分を`complement`とする | ||
| - Mapのキーとして「走査済みの値」ではなく「ターゲットと走査した値の差分」をセットする |
| - 後で引き算するか先に引き算するかの違い。個人的には今回書いている前者の方が分かりやすいように思う | ||
| - その他二分探索を使用した書き方も考えられる | ||
| - しかし二分探索するためにはソート&元のインデックスを保持する必要があるためこの場合は不適なように感じる | ||
| - この問題の条件で二分探索の方が適する入力のケースってあるだろうか? |
There was a problem hiding this comment.
メモリーに片方が乗らないサイズとかですかね。
まあ、私が思うのは、この問題、手で解くとしたらどうするかです。部屋にカードが1000枚あって、和がある値になる組を探せといわれたら、100万回足し算するかですよ。
| return new int[]{i, j}; | ||
| } | ||
| } | ||
| } |
There was a problem hiding this comment.
細かいところで恐縮ですが、ここの閉じカッコ"}"と対応するfor文だけインデントがズレてませんか?
| for(int i = 0; i < nums.length; i++) { | ||
| int num = nums[i]; | ||
| int partnerNum = target - num; | ||
| Integer partnerIndex = numToIndex.get(partnerNum); |
There was a problem hiding this comment.
確かに後続の処理では int としてしか使っていないので、この時点で int としておくべきでした。
| class Solution { | ||
| public int[] twoSum(int[] nums, int target) { | ||
| Map<Integer, Integer> numToIndex = new HashMap<>(); | ||
| for(int i = 0; i < nums.length; i++) { |
There was a problem hiding this comment.
for のあとにスペースを空けることをおすすめします。
参考までにスタイルガイドへのリンクを貼ります。
https://google.github.io/styleguide/javaguide.html#s4.6.2-horizontal-whitespace
Separating any keyword, such as if, for or catch, from an open parenthesis (() that follows it on that line
上記のスタイルガイドは唯一絶対のルールではなく、複数あるスタイルガイドの一つに過ぎないということを念頭に置くことをお勧めします。また、所属するチームにより何が良いとされているかは変わります。自分の中で良い書き方の基準を持ちつつ、チームの平均的な書き方で書くことをお勧めいたします。
|
|
||
| ## 解答 | ||
| - hashMapを使った実装 | ||
| - partnerという単語がパッと思い浮かんだが分かりやすいだろうか |
There was a problem hiding this comment.
partnerはちょっと違和感ありますね。
a person or organization you are closely involved with in some way
There was a problem hiding this comment.
やはり自然な英単語としてはcomplementになるでしょうか。
コメントありがとうございます!
There was a problem hiding this comment.
まあ無理に1単語で表さなくても、「足すとtargetになる数字」、「targetとの差分」みたいな感じでdifferenceToTargetとかでも良いかなと思いました。
There was a problem hiding this comment.
良い変数名を例示いただきありがとうございます!
complementより直感的に分かりやすいです。
今回解いた問題:
1. Two Sum
次に解く問題:
49. Group Anagrams