diff --git a/pullrequests/two_sum/step1.go b/pullrequests/two_sum/step1.go new file mode 100644 index 0000000..ba27643 --- /dev/null +++ b/pullrequests/two_sum/step1.go @@ -0,0 +1,18 @@ +//lint:file-ignore U1000 Ignore all unused code +package twosum + +/* +かなり前に解いたものなので詳細は忘れてしまいましたが、ナイーブにやる方法では各文字ごとに毎回リストを走査してしまうと時間計算量がO(n^2)になってしまうので、オーバーヘッドはありますが、ハッシュ化するのが良いと考えました。 + +また同じ要素を2回使うのを避けるために、毎回追加する前に対応する要素がないかを確認してから追加するようにしました。 +*/ +func twoSumStep1(nums []int, target int) []int { + m := make(map[int]int) + for i, n := range nums { + if j, ok := m[target-n]; ok { + return []int{i, j} + } + m[n] = i + } + return nil +} diff --git a/pullrequests/two_sum/step2.go b/pullrequests/two_sum/step2.go new file mode 100644 index 0000000..7a8ea9e --- /dev/null +++ b/pullrequests/two_sum/step2.go @@ -0,0 +1,25 @@ +//lint:file-ignore U1000 Ignore all unused code +package twosum + +/* +mではなく、よりわかりやすいようにnumsMapとしました。 +GoogleのGoスタイルガイドには変数名に型名を使うのは良くないと書かれていますが、同時に下記のようにも書かれています。今回はnumsという配列をマップに変換したもの(配列もインデックスと値を情報としてもつ)と捉えることができるため、対応していることを示すためにnumsMapとしました。 + +`It is acceptable to include a type-like qualifier if there are two versions of a value in scope, for example you might have an input stored in ageString and use age for the parsed value.` + +`numToIdx`というのもありそう(https://github.com/aoshi2025s/leetcode-review/pull/1#discussion_r1666780953)。 + +対応する組み合わせが見つからなかった際にどうするのかは難しいところ。 + - https://github.com/seal-azarashi/leetcode/pull/11#discussion_r1672537855 + - https://github.com/sendahuang14/leetcode/pull/11#discussion_r1702393602 +*/ +func twoSumStep2(nums []int, target int) []int { + numsMap := make(map[int]int) + for i, n := range nums { + if j, ok := numsMap[target-n]; ok { + return []int{i, j} + } + numsMap[n] = i + } + return nil +} diff --git a/pullrequests/two_sum/step3.go b/pullrequests/two_sum/step3.go new file mode 100644 index 0000000..dff0f34 --- /dev/null +++ b/pullrequests/two_sum/step3.go @@ -0,0 +1,13 @@ +//lint:file-ignore U1000 Ignore all unused code +package twosum + +func twoSumStep3(nums []int, target int) []int { + numToIndex := make(map[int]int) + for i, n := range nums { + if j, ok := numToIndex[target-n]; ok { + return []int{i, j} + } + numToIndex[n] = i + } + return nil // 本来ならerrorを返したい +}