From 08581026a58ad9939d4d5a4a4b989f2d7bd28af3 Mon Sep 17 00:00:00 2001 From: rihib Date: Wed, 7 Aug 2024 01:47:19 +0900 Subject: [PATCH 1/2] pullrequests/two_sum --- pullrequests/two_sum/step1.go | 18 ++++++++++++++++++ pullrequests/two_sum/step2.go | 25 +++++++++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 pullrequests/two_sum/step1.go create mode 100644 pullrequests/two_sum/step2.go diff --git a/pullrequests/two_sum/step1.go b/pullrequests/two_sum/step1.go new file mode 100644 index 0000000..1886c4c --- /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 twoSum_step1(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..e44f024 --- /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 twoSum_step2(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 +} From 70a5f337ee8c4b44e3e62c96dde88657beb95221 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 23 Sep 2024 22:13:49 +0900 Subject: [PATCH 2/2] fix pullrequests/two_sum --- pullrequests/two_sum/step1.go | 2 +- pullrequests/two_sum/step2.go | 2 +- pullrequests/two_sum/step3.go | 13 +++++++++++++ 3 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 pullrequests/two_sum/step3.go diff --git a/pullrequests/two_sum/step1.go b/pullrequests/two_sum/step1.go index 1886c4c..ba27643 100644 --- a/pullrequests/two_sum/step1.go +++ b/pullrequests/two_sum/step1.go @@ -6,7 +6,7 @@ package twosum また同じ要素を2回使うのを避けるために、毎回追加する前に対応する要素がないかを確認してから追加するようにしました。 */ -func twoSum_step1(nums []int, target int) []int { +func twoSumStep1(nums []int, target int) []int { m := make(map[int]int) for i, n := range nums { if j, ok := m[target-n]; ok { diff --git a/pullrequests/two_sum/step2.go b/pullrequests/two_sum/step2.go index e44f024..7a8ea9e 100644 --- a/pullrequests/two_sum/step2.go +++ b/pullrequests/two_sum/step2.go @@ -13,7 +13,7 @@ GoogleのGoスタイルガイドには変数名に型名を使うのは良くな - https://github.com/seal-azarashi/leetcode/pull/11#discussion_r1672537855 - https://github.com/sendahuang14/leetcode/pull/11#discussion_r1702393602 */ -func twoSum_step2(nums []int, target int) []int { +func twoSumStep2(nums []int, target int) []int { numsMap := make(map[int]int) for i, n := range nums { if j, ok := numsMap[target-n]; ok { 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を返したい +}