From bbef76e9f5d0fc47f2baf4abc159d4634f940473 Mon Sep 17 00:00:00 2001 From: rihib <76939037+rihib@users.noreply.github.com> Date: Sun, 7 Jan 2024 16:06:30 +0900 Subject: [PATCH 001/396] Initial commit --- .gitignore | 21 +++++++++++++++++++++ README.md | 1 + 2 files changed, 22 insertions(+) create mode 100644 .gitignore create mode 100644 README.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3b735ec --- /dev/null +++ b/.gitignore @@ -0,0 +1,21 @@ +# If you prefer the allow list template instead of the deny list, see community template: +# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore +# +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# Dependency directories (remove the comment below to include it) +# vendor/ + +# Go workspace file +go.work diff --git a/README.md b/README.md new file mode 100644 index 0000000..e0b47cd --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# neetcode \ No newline at end of file From 83dde473b356b45459814d62b15718391d2efd91 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 7 Jan 2024 16:47:10 +0900 Subject: [PATCH 002/396] =?UTF-8?q?=E8=A9=A6=E3=81=97=E3=81=AB=EF=BC=91?= =?UTF-8?q?=E5=95=8F=E7=9B=AE=E3=82=92=E8=A7=A3=E3=81=84=E3=81=A6=E3=81=BF?= =?UTF-8?q?=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- blind75/contains_duplicate.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 blind75/contains_duplicate.go diff --git a/blind75/contains_duplicate.go b/blind75/contains_duplicate.go new file mode 100644 index 0000000..af0e009 --- /dev/null +++ b/blind75/contains_duplicate.go @@ -0,0 +1,13 @@ +func containsDuplicate(nums []int) bool { + if len(nums) <= 1 { + return false + } + nm := make(map([int]struct{})) + for _, v := range nums { + if _, ok := nm[v]; ok { + return true; + } + nm[v] = struct{}{} + } + return false +} From 9d58ed3a36a05dc6d97e36bca385d0d37e54f61b Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 7 Jan 2024 16:48:17 +0900 Subject: [PATCH 003/396] fix --- blind75/contains_duplicate.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blind75/contains_duplicate.go b/blind75/contains_duplicate.go index af0e009..6b7b55d 100644 --- a/blind75/contains_duplicate.go +++ b/blind75/contains_duplicate.go @@ -2,7 +2,7 @@ func containsDuplicate(nums []int) bool { if len(nums) <= 1 { return false } - nm := make(map([int]struct{})) + nm := make(map[int]struct{}) for _, v := range nums { if _, ok := nm[v]; ok { return true; From 608eeb1ca39ac247a7cebb151506434c46f5c5bd Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 7 Jan 2024 17:54:13 +0900 Subject: [PATCH 004/396] Add contains_duplicate.go and go.mod files --- blind75/contains_duplicate.go | 4 +++- go.mod | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 go.mod diff --git a/blind75/contains_duplicate.go b/blind75/contains_duplicate.go index 6b7b55d..79ea148 100644 --- a/blind75/contains_duplicate.go +++ b/blind75/contains_duplicate.go @@ -1,3 +1,5 @@ +package blind75 + func containsDuplicate(nums []int) bool { if len(nums) <= 1 { return false @@ -5,7 +7,7 @@ func containsDuplicate(nums []int) bool { nm := make(map[int]struct{}) for _, v := range nums { if _, ok := nm[v]; ok { - return true; + return true } nm[v] = struct{}{} } diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..d322c78 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module neetcode + +go 1.21.5 From 676b0ab59807a7f49b18e4cc9e96402abc66218c Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 4 Feb 2024 16:39:48 +0900 Subject: [PATCH 005/396] submit --- blind75/contains_duplicate.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/blind75/contains_duplicate.go b/blind75/contains_duplicate.go index 79ea148..dde9639 100644 --- a/blind75/contains_duplicate.go +++ b/blind75/contains_duplicate.go @@ -4,12 +4,13 @@ func containsDuplicate(nums []int) bool { if len(nums) <= 1 { return false } + nm := make(map[int]struct{}) - for _, v := range nums { - if _, ok := nm[v]; ok { + for _, n := range nums { + if _, ok := nm[n]; ok { return true } - nm[v] = struct{}{} + nm[n] = struct{}{} } return false } From 3028c4192a00a8646a318ec2105efb6a09fb8de1 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 4 Feb 2024 17:41:08 +0900 Subject: [PATCH 006/396] submit valid anagram --- blind75/valid_anagram.go | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 blind75/valid_anagram.go diff --git a/blind75/valid_anagram.go b/blind75/valid_anagram.go new file mode 100644 index 0000000..4dcef20 --- /dev/null +++ b/blind75/valid_anagram.go @@ -0,0 +1,20 @@ +package blind75 + +func isAnagram(s string, t string) bool { + if len(s) != len(t) { + return false + } + + var freq [26]int + + for i := 0; i < len(s); i++ { + freq[s[i]-'a']++ + freq[t[i]-'a']-- + } + for _, v := range freq { + if v != 0 { + return false + } + } + return true +} From d0ce5c6b92491de1eec2e0945992be345cec286b Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 4 Feb 2024 20:35:55 +0900 Subject: [PATCH 007/396] submit valid anagram follow up --- blind75/valid_anagram_followup.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 blind75/valid_anagram_followup.go diff --git a/blind75/valid_anagram_followup.go b/blind75/valid_anagram_followup.go new file mode 100644 index 0000000..175f08a --- /dev/null +++ b/blind75/valid_anagram_followup.go @@ -0,0 +1,19 @@ +package blind75 + +func isAnagram_unicode(s string, t string) bool { + if len(s) != len(t) { + return false + } + + freq := make(map[rune]int) + for _, r := range s { + freq[r]++ + } + for _, r := range t { + freq[r]-- + if freq[r] < 0 { + return false + } + } + return true +} From 3b7d4d8561ed3f8f59dba24f1801a021766ea05b Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 4 Feb 2024 21:23:41 +0900 Subject: [PATCH 008/396] submit two sum --- blind75/two_sum.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 blind75/two_sum.go diff --git a/blind75/two_sum.go b/blind75/two_sum.go new file mode 100644 index 0000000..ecb6d58 --- /dev/null +++ b/blind75/two_sum.go @@ -0,0 +1,12 @@ +package blind75 + +func twoSum(nums []int, target int) []int { + m := make(map[int]int) + for i, n := range nums { + if v, found := m[target-n]; found { + return []int{i, v} + } + m[n] = i + } + return nil +} From e59f11a69aaa29fe3c7ceeba88e1a6f02bcb76cc Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 4 Feb 2024 23:38:24 +0900 Subject: [PATCH 009/396] refactor contains duplicate --- blind75/contains_duplicate.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/blind75/contains_duplicate.go b/blind75/contains_duplicate.go index dde9639..e02e71b 100644 --- a/blind75/contains_duplicate.go +++ b/blind75/contains_duplicate.go @@ -5,12 +5,12 @@ func containsDuplicate(nums []int) bool { return false } - nm := make(map[int]struct{}) + m := make(map[int]struct{}) for _, n := range nums { - if _, ok := nm[n]; ok { + if _, ok := m[n]; ok { return true } - nm[n] = struct{}{} + m[n] = struct{}{} } return false } From 1a7820cf47730e784c75122710c328be55fb730d Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 4 Feb 2024 23:52:22 +0900 Subject: [PATCH 010/396] refactor two sum --- blind75/two_sum.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blind75/two_sum.go b/blind75/two_sum.go index ecb6d58..b898f28 100644 --- a/blind75/two_sum.go +++ b/blind75/two_sum.go @@ -3,8 +3,8 @@ package blind75 func twoSum(nums []int, target int) []int { m := make(map[int]int) for i, n := range nums { - if v, found := m[target-n]; found { - return []int{i, v} + if j, found := m[target-n]; found { + return []int{i, j} } m[n] = i } From 698d665652950746ebac6515b35825ebc1ed710d Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 5 Feb 2024 15:38:56 +0900 Subject: [PATCH 011/396] refactor contains duplicate --- blind75/contains_duplicate.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blind75/contains_duplicate.go b/blind75/contains_duplicate.go index e02e71b..33b8ed5 100644 --- a/blind75/contains_duplicate.go +++ b/blind75/contains_duplicate.go @@ -7,7 +7,7 @@ func containsDuplicate(nums []int) bool { m := make(map[int]struct{}) for _, n := range nums { - if _, ok := m[n]; ok { + if _, found := m[n]; found { return true } m[n] = struct{}{} From 7f28b377ecbc1082de9d201321db42a15d00ce6f Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 5 Feb 2024 18:27:24 +0900 Subject: [PATCH 012/396] submit group anagrams --- blind75/group_anagram.go | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 blind75/group_anagram.go diff --git a/blind75/group_anagram.go b/blind75/group_anagram.go new file mode 100644 index 0000000..46ffead --- /dev/null +++ b/blind75/group_anagram.go @@ -0,0 +1,20 @@ +package blind75 + +func groupAnagrams(strs []string) [][]string { + m := make(map[[26]int][]string) + for _, s := range strs { + var freq [26]int + for _, r := range s { + freq[r-'a']++ + } + m[freq] = append(m[freq], s) + } + + result := make([][]string, len(m)) + i := 0 + for _, v := range m { + result[i] = v + i++ + } + return result +} From 9e5dc8650e081e16b5f3772eca578ca7a1fe9eed Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 5 Feb 2024 18:30:21 +0900 Subject: [PATCH 013/396] refactor valid anagram --- blind75/valid_anagram.go | 1 - 1 file changed, 1 deletion(-) diff --git a/blind75/valid_anagram.go b/blind75/valid_anagram.go index 4dcef20..39fcbc2 100644 --- a/blind75/valid_anagram.go +++ b/blind75/valid_anagram.go @@ -6,7 +6,6 @@ func isAnagram(s string, t string) bool { } var freq [26]int - for i := 0; i < len(s); i++ { freq[s[i]-'a']++ freq[t[i]-'a']-- From f0f88f407d0cba355889a940fd239c1bf104e53a Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 5 Feb 2024 18:37:50 +0900 Subject: [PATCH 014/396] fix typo in filename --- blind75/group_anagrams.go | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 blind75/group_anagrams.go diff --git a/blind75/group_anagrams.go b/blind75/group_anagrams.go new file mode 100644 index 0000000..46ffead --- /dev/null +++ b/blind75/group_anagrams.go @@ -0,0 +1,20 @@ +package blind75 + +func groupAnagrams(strs []string) [][]string { + m := make(map[[26]int][]string) + for _, s := range strs { + var freq [26]int + for _, r := range s { + freq[r-'a']++ + } + m[freq] = append(m[freq], s) + } + + result := make([][]string, len(m)) + i := 0 + for _, v := range m { + result[i] = v + i++ + } + return result +} From 257e537390f2d817500ece15140f762f72ba0e6b Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 5 Feb 2024 18:38:16 +0900 Subject: [PATCH 015/396] fix typo in filename --- blind75/group_anagram.go | 20 -------------------- 1 file changed, 20 deletions(-) delete mode 100644 blind75/group_anagram.go diff --git a/blind75/group_anagram.go b/blind75/group_anagram.go deleted file mode 100644 index 46ffead..0000000 --- a/blind75/group_anagram.go +++ /dev/null @@ -1,20 +0,0 @@ -package blind75 - -func groupAnagrams(strs []string) [][]string { - m := make(map[[26]int][]string) - for _, s := range strs { - var freq [26]int - for _, r := range s { - freq[r-'a']++ - } - m[freq] = append(m[freq], s) - } - - result := make([][]string, len(m)) - i := 0 - for _, v := range m { - result[i] = v - i++ - } - return result -} From 9864e287dc285037bcc686dad0d4834881fb4f74 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 5 Feb 2024 21:05:52 +0900 Subject: [PATCH 016/396] submit top k frequent elements --- blind75/top_k_frequent_elements.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 blind75/top_k_frequent_elements.go diff --git a/blind75/top_k_frequent_elements.go b/blind75/top_k_frequent_elements.go new file mode 100644 index 0000000..4b3565f --- /dev/null +++ b/blind75/top_k_frequent_elements.go @@ -0,0 +1,22 @@ +package blind75 + +func topKFrequent(nums []int, k int) []int { + freq := make(map[int]int) + for _, n := range nums { + freq[n]++ + } + + cs := make([][]int, len(nums)) + for n, c := range freq { + cs[c-1] = append(cs[c-1], n) + } + + var res []int + for i := len(cs) - 1; i >= 0; i-- { + res = append(res, cs[i]...) + if len(res) >= k { + break + } + } + return res +} From b9e51db02a2e1ed50f900a9bac1f541b6ed0dc19 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 5 Feb 2024 21:06:11 +0900 Subject: [PATCH 017/396] refactor group anagrams --- blind75/group_anagrams.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/blind75/group_anagrams.go b/blind75/group_anagrams.go index 46ffead..5b0b787 100644 --- a/blind75/group_anagrams.go +++ b/blind75/group_anagrams.go @@ -10,11 +10,11 @@ func groupAnagrams(strs []string) [][]string { m[freq] = append(m[freq], s) } - result := make([][]string, len(m)) + res := make([][]string, len(m)) i := 0 for _, v := range m { - result[i] = v + res[i] = v i++ } - return result + return res } From d3dd604678c9236cfed0783973e8f9ad4ca4e466 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 5 Feb 2024 23:24:16 +0900 Subject: [PATCH 018/396] submit another solution for contains duplicate --- blind75/contains_duplicate_2.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 blind75/contains_duplicate_2.go diff --git a/blind75/contains_duplicate_2.go b/blind75/contains_duplicate_2.go new file mode 100644 index 0000000..87841d6 --- /dev/null +++ b/blind75/contains_duplicate_2.go @@ -0,0 +1,16 @@ +package blind75 + +func containsDuplicate2(nums []int) bool { + if len(nums) <= 1 { + return false + } + + m := make(map[int]struct{}) + for _, n := range nums { + m[n] = struct{}{} + } + if len(nums) != len(m) { + return true + } + return false +} From c705fda14c0511bda5c6174adcd2936d14bcd592 Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 6 Feb 2024 16:39:18 +0900 Subject: [PATCH 019/396] refactor contains duplicate 2 --- blind75/contains_duplicate_2.go | 1 + 1 file changed, 1 insertion(+) diff --git a/blind75/contains_duplicate_2.go b/blind75/contains_duplicate_2.go index 87841d6..4ca3233 100644 --- a/blind75/contains_duplicate_2.go +++ b/blind75/contains_duplicate_2.go @@ -9,6 +9,7 @@ func containsDuplicate2(nums []int) bool { for _, n := range nums { m[n] = struct{}{} } + if len(nums) != len(m) { return true } From d05cf7db69bf54ac2b9c4c4966dfc8e8a839c4ec Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 6 Feb 2024 16:51:23 +0900 Subject: [PATCH 020/396] refactor valid anagram --- blind75/valid_anagram.go | 1 + 1 file changed, 1 insertion(+) diff --git a/blind75/valid_anagram.go b/blind75/valid_anagram.go index 39fcbc2..9992edc 100644 --- a/blind75/valid_anagram.go +++ b/blind75/valid_anagram.go @@ -10,6 +10,7 @@ func isAnagram(s string, t string) bool { freq[s[i]-'a']++ freq[t[i]-'a']-- } + for _, v := range freq { if v != 0 { return false From ff5f6ad0c1e7ba59ef048bdd33feef43483565f6 Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 6 Feb 2024 17:06:36 +0900 Subject: [PATCH 021/396] refactor valid anagram follow up --- blind75/valid_anagram_followup.go | 1 + 1 file changed, 1 insertion(+) diff --git a/blind75/valid_anagram_followup.go b/blind75/valid_anagram_followup.go index 175f08a..47afeb7 100644 --- a/blind75/valid_anagram_followup.go +++ b/blind75/valid_anagram_followup.go @@ -9,6 +9,7 @@ func isAnagram_unicode(s string, t string) bool { for _, r := range s { freq[r]++ } + for _, r := range t { freq[r]-- if freq[r] < 0 { From 4bf0a50a9ed8ba7b1be973ab05329a9e1cc42c25 Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 6 Feb 2024 20:24:20 +0900 Subject: [PATCH 022/396] submit product of array except self --- blind75/product_of_array_except_self.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 blind75/product_of_array_except_self.go diff --git a/blind75/product_of_array_except_self.go b/blind75/product_of_array_except_self.go new file mode 100644 index 0000000..8a6e7df --- /dev/null +++ b/blind75/product_of_array_except_self.go @@ -0,0 +1,19 @@ +package blind75 + +func productExceptSelf(nums []int) []int { + res := make([]int, len(nums)) + + rp := 1 + for i := 0; i < len(nums); i++ { + res[i] = rp + rp *= nums[i] + } + + lp := 1 + for i := len(nums) - 1; i >= 0; i-- { + res[i] *= lp + lp *= nums[i] + } + + return res +} From e7a80f284d5bf59bb2610aad6f766a0243c9c118 Mon Sep 17 00:00:00 2001 From: rihib <76939037+rihib@users.noreply.github.com> Date: Tue, 6 Feb 2024 20:35:00 +0900 Subject: [PATCH 023/396] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e0b47cd..1a8a55d 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -# neetcode \ No newline at end of file +# leetcode From af0ac440d5745d62dd222358c56a87dc03419935 Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 6 Feb 2024 20:36:34 +0900 Subject: [PATCH 024/396] refactor product of array except self --- blind75/product_of_array_except_self.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/blind75/product_of_array_except_self.go b/blind75/product_of_array_except_self.go index 8a6e7df..ca5eab2 100644 --- a/blind75/product_of_array_except_self.go +++ b/blind75/product_of_array_except_self.go @@ -3,16 +3,16 @@ package blind75 func productExceptSelf(nums []int) []int { res := make([]int, len(nums)) - rp := 1 + lp := 1 for i := 0; i < len(nums); i++ { - res[i] = rp - rp *= nums[i] + res[i] = lp + lp *= nums[i] } - lp := 1 + rp := 1 for i := len(nums) - 1; i >= 0; i-- { - res[i] *= lp - lp *= nums[i] + res[i] *= rp + rp *= nums[i] } return res From f20dacd8582ea3a5ca6c7506b2fdc41a41ebb157 Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 6 Feb 2024 22:06:27 +0900 Subject: [PATCH 025/396] submit longest consecutive sequence --- blind75/longest_consecutive_sequence.go | 30 +++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 blind75/longest_consecutive_sequence.go diff --git a/blind75/longest_consecutive_sequence.go b/blind75/longest_consecutive_sequence.go new file mode 100644 index 0000000..1311de2 --- /dev/null +++ b/blind75/longest_consecutive_sequence.go @@ -0,0 +1,30 @@ +package blind75 + +func longestConsecutive(nums []int) int { + m := make(map[int]struct{}) + for _, n := range nums { + m[n] = struct{}{} + } + + max_len := 0 + for n := range m { + if _, found := m[n-1]; found { + continue + } + + l := 1 + for i := 1; ; i++ { + if _, found := m[n+i]; found { + l++ + } else { + break + } + } + + if l > max_len { + max_len = l + } + } + + return max_len +} From 48c57e245da050a9efacb87f7bdbdcf44a44105c Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 6 Feb 2024 22:53:41 +0900 Subject: [PATCH 026/396] refactor longest consecutive sequence --- blind75/longest_consecutive_sequence.go | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/blind75/longest_consecutive_sequence.go b/blind75/longest_consecutive_sequence.go index 1311de2..88daa4a 100644 --- a/blind75/longest_consecutive_sequence.go +++ b/blind75/longest_consecutive_sequence.go @@ -12,19 +12,14 @@ func longestConsecutive(nums []int) int { continue } - l := 1 - for i := 1; ; i++ { - if _, found := m[n+i]; found { - l++ - } else { + for l := 1; ; l++ { + if _, found := m[n+l]; !found { + if l > max_len { + max_len = l + } break } } - - if l > max_len { - max_len = l - } } - return max_len } From 5a7a6fecb953b947a9070a3ba3b63daf939738f0 Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 6 Feb 2024 23:03:43 +0900 Subject: [PATCH 027/396] refactor longest consecutive sequence --- blind75/longest_consecutive_sequence.go | 1 + 1 file changed, 1 insertion(+) diff --git a/blind75/longest_consecutive_sequence.go b/blind75/longest_consecutive_sequence.go index 88daa4a..c35fc94 100644 --- a/blind75/longest_consecutive_sequence.go +++ b/blind75/longest_consecutive_sequence.go @@ -21,5 +21,6 @@ func longestConsecutive(nums []int) int { } } } + return max_len } From e6f75661ddd6fe3db2deab186b649e55eb6fd592 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 10 Feb 2024 22:25:17 +0900 Subject: [PATCH 028/396] submit valid_parentheses --- blind75/valid_parentheses.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 blind75/valid_parentheses.go diff --git a/blind75/valid_parentheses.go b/blind75/valid_parentheses.go new file mode 100644 index 0000000..e000690 --- /dev/null +++ b/blind75/valid_parentheses.go @@ -0,0 +1,26 @@ +package blind75 + +func isValid(s string) bool { + var stack []rune + open_brackets := map[rune]struct{}{'(': {}, '{': {}, '[': {}} + close_brackets := map[rune]rune{')': '(', '}': '{', ']': '['} + + for _, r := range s { + if _, found := open_brackets[r]; found { + stack = append(stack, r) + } + + if v, found := close_brackets[r]; found { + if len(stack) < 1 { + return false + } + + if stack[len(stack)-1] != v { + return false + } + stack = stack[:len(stack)-1] + } + } + + return len(stack) == 0 +} From 62bb1e8720f3ccadcb14472c8eda10a3ac61014a Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 10 Feb 2024 22:39:41 +0900 Subject: [PATCH 029/396] refactor valid parentheses --- blind75/valid_parentheses.go | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/blind75/valid_parentheses.go b/blind75/valid_parentheses.go index e000690..1d78115 100644 --- a/blind75/valid_parentheses.go +++ b/blind75/valid_parentheses.go @@ -2,24 +2,20 @@ package blind75 func isValid(s string) bool { var stack []rune - open_brackets := map[rune]struct{}{'(': {}, '{': {}, '[': {}} - close_brackets := map[rune]rune{')': '(', '}': '{', ']': '['} + brackets := map[rune]rune{')': '(', '}': '{', ']': '['} for _, r := range s { - if _, found := open_brackets[r]; found { + v, found := brackets[r] + + if !found { stack = append(stack, r) + continue } - if v, found := close_brackets[r]; found { - if len(stack) < 1 { - return false - } - - if stack[len(stack)-1] != v { - return false - } - stack = stack[:len(stack)-1] + if len(stack) < 1 || stack[len(stack)-1] != v { + return false } + stack = stack[:len(stack)-1] } return len(stack) == 0 From 8cb9395ada6a513ea40a940b14e3eddc5a94e5d2 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 10 Feb 2024 23:09:13 +0900 Subject: [PATCH 030/396] refactor valid parentheses --- blind75/valid_parentheses.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blind75/valid_parentheses.go b/blind75/valid_parentheses.go index 1d78115..b4bac03 100644 --- a/blind75/valid_parentheses.go +++ b/blind75/valid_parentheses.go @@ -1,8 +1,8 @@ package blind75 func isValid(s string) bool { - var stack []rune brackets := map[rune]rune{')': '(', '}': '{', ']': '['} + var stack []rune for _, r := range s { v, found := brackets[r] From 976fccca62409a052bb56768bdc382daf1c902e4 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 10 Feb 2024 23:29:57 +0900 Subject: [PATCH 031/396] replace found with ok --- blind75/contains_duplicate.go | 2 +- blind75/longest_consecutive_sequence.go | 4 ++-- blind75/two_sum.go | 2 +- blind75/valid_parentheses.go | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/blind75/contains_duplicate.go b/blind75/contains_duplicate.go index 33b8ed5..e02e71b 100644 --- a/blind75/contains_duplicate.go +++ b/blind75/contains_duplicate.go @@ -7,7 +7,7 @@ func containsDuplicate(nums []int) bool { m := make(map[int]struct{}) for _, n := range nums { - if _, found := m[n]; found { + if _, ok := m[n]; ok { return true } m[n] = struct{}{} diff --git a/blind75/longest_consecutive_sequence.go b/blind75/longest_consecutive_sequence.go index c35fc94..cd61f54 100644 --- a/blind75/longest_consecutive_sequence.go +++ b/blind75/longest_consecutive_sequence.go @@ -8,12 +8,12 @@ func longestConsecutive(nums []int) int { max_len := 0 for n := range m { - if _, found := m[n-1]; found { + if _, ok := m[n-1]; ok { continue } for l := 1; ; l++ { - if _, found := m[n+l]; !found { + if _, ok := m[n+l]; !ok { if l > max_len { max_len = l } diff --git a/blind75/two_sum.go b/blind75/two_sum.go index b898f28..28bbefa 100644 --- a/blind75/two_sum.go +++ b/blind75/two_sum.go @@ -3,7 +3,7 @@ package blind75 func twoSum(nums []int, target int) []int { m := make(map[int]int) for i, n := range nums { - if j, found := m[target-n]; found { + if j, ok := m[target-n]; ok { return []int{i, j} } m[n] = i diff --git a/blind75/valid_parentheses.go b/blind75/valid_parentheses.go index b4bac03..83bdff8 100644 --- a/blind75/valid_parentheses.go +++ b/blind75/valid_parentheses.go @@ -5,9 +5,9 @@ func isValid(s string) bool { var stack []rune for _, r := range s { - v, found := brackets[r] + v, ok := brackets[r] - if !found { + if !ok { stack = append(stack, r) continue } From 2497da0874f2b341072cdfda9c144bd3fe0f4310 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 10 Feb 2024 23:36:54 +0900 Subject: [PATCH 032/396] Create .vscode for workspace --- .vscode/settings.json | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..757d081 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "github.copilot.enable": { + "*": false, + "plaintext": false, + "markdown": true, + "scminput": false + }, +} From ddf71769b43090f260c03cc7a60284fb6f3938d0 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 11 Feb 2024 00:20:16 +0900 Subject: [PATCH 033/396] submit merge two sorted lists --- blind75/merge_two_sorted_lists.go | 46 +++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 blind75/merge_two_sorted_lists.go diff --git a/blind75/merge_two_sorted_lists.go b/blind75/merge_two_sorted_lists.go new file mode 100644 index 0000000..f823ffd --- /dev/null +++ b/blind75/merge_two_sorted_lists.go @@ -0,0 +1,46 @@ +package blind75 + +type ListNode struct { + Val int + Next *ListNode +} + +func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode { + if list1 == nil { + return list2 + } + if list2 == nil { + return list1 + } + + var res *ListNode + if list1.Val <= list2.Val { + res = list1 + list1 = list1.Next + } else { + res = list2 + list2 = list2.Next + } + + curNode := res + for { + if list1 == nil { + curNode.Next = list2 + return res + } + if list2 == nil { + curNode.Next = list1 + return res + } + + if list1.Val <= list2.Val { + curNode.Next = list1 + curNode = curNode.Next + list1 = list1.Next + } else { + curNode.Next = list2 + curNode = curNode.Next + list2 = list2.Next + } + } +} From bf0649c41a7e381e2ddb20f987b3c53cee9d6caf Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 11 Feb 2024 01:03:58 +0900 Subject: [PATCH 034/396] refactor merge two sorted lists --- blind75/merge_two_sorted_lists.go | 44 ++++++++++--------------------- 1 file changed, 14 insertions(+), 30 deletions(-) diff --git a/blind75/merge_two_sorted_lists.go b/blind75/merge_two_sorted_lists.go index f823ffd..b227a71 100644 --- a/blind75/merge_two_sorted_lists.go +++ b/blind75/merge_two_sorted_lists.go @@ -6,41 +6,25 @@ type ListNode struct { } func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode { - if list1 == nil { - return list2 - } - if list2 == nil { - return list1 - } - - var res *ListNode - if list1.Val <= list2.Val { - res = list1 - list1 = list1.Next - } else { - res = list2 - list2 = list2.Next - } - - curNode := res - for { - if list1 == nil { - curNode.Next = list2 - return res - } - if list2 == nil { - curNode.Next = list1 - return res - } + dummy := new(ListNode) + cur := dummy + for list1 != nil && list2 != nil { if list1.Val <= list2.Val { - curNode.Next = list1 - curNode = curNode.Next + cur.Next = list1 list1 = list1.Next } else { - curNode.Next = list2 - curNode = curNode.Next + cur.Next = list2 list2 = list2.Next } + cur = cur.Next + } + + if list1 != nil { + cur.Next = list1 + } else { + cur.Next = list2 } + + return dummy.Next } From 6d2c3752edc5c6fba0d01696dfffeb7c858dd264 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 11 Feb 2024 01:25:27 +0900 Subject: [PATCH 035/396] refactor merge two sorted lists --- blind75/merge_two_sorted_lists.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/blind75/merge_two_sorted_lists.go b/blind75/merge_two_sorted_lists.go index b227a71..effa042 100644 --- a/blind75/merge_two_sorted_lists.go +++ b/blind75/merge_two_sorted_lists.go @@ -20,11 +20,12 @@ func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode { cur = cur.Next } - if list1 != nil { - cur.Next = list1 - } else { + if list1 == nil { cur.Next = list2 } + if list2 == nil { + cur.Next = list1 + } return dummy.Next } From b5a25ff263b7ec5e84c96860383443c9db3ff31b Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 11 Feb 2024 01:28:00 +0900 Subject: [PATCH 036/396] delete blind75 dir --- blind75/contains_duplicate.go => contains_duplicate.go | 0 ...tains_duplicate_2.go => contains_duplicate_another_solution.go | 0 blind75/group_anagrams.go => group_anagrams.go | 0 ...est_consecutive_sequence.go => longest_consecutive_sequence.go | 0 blind75/merge_two_sorted_lists.go => merge_two_sorted_lists.go | 0 ...uct_of_array_except_self.go => product_of_array_except_self.go | 0 blind75/top_k_frequent_elements.go => top_k_frequent_elements.go | 0 blind75/two_sum.go => two_sum.go | 0 blind75/valid_anagram.go => valid_anagram.go | 0 ...valid_anagram_followup.go => valid_anagram_another_solution.go | 0 blind75/valid_parentheses.go => valid_parentheses.go | 0 11 files changed, 0 insertions(+), 0 deletions(-) rename blind75/contains_duplicate.go => contains_duplicate.go (100%) rename blind75/contains_duplicate_2.go => contains_duplicate_another_solution.go (100%) rename blind75/group_anagrams.go => group_anagrams.go (100%) rename blind75/longest_consecutive_sequence.go => longest_consecutive_sequence.go (100%) rename blind75/merge_two_sorted_lists.go => merge_two_sorted_lists.go (100%) rename blind75/product_of_array_except_self.go => product_of_array_except_self.go (100%) rename blind75/top_k_frequent_elements.go => top_k_frequent_elements.go (100%) rename blind75/two_sum.go => two_sum.go (100%) rename blind75/valid_anagram.go => valid_anagram.go (100%) rename blind75/valid_anagram_followup.go => valid_anagram_another_solution.go (100%) rename blind75/valid_parentheses.go => valid_parentheses.go (100%) diff --git a/blind75/contains_duplicate.go b/contains_duplicate.go similarity index 100% rename from blind75/contains_duplicate.go rename to contains_duplicate.go diff --git a/blind75/contains_duplicate_2.go b/contains_duplicate_another_solution.go similarity index 100% rename from blind75/contains_duplicate_2.go rename to contains_duplicate_another_solution.go diff --git a/blind75/group_anagrams.go b/group_anagrams.go similarity index 100% rename from blind75/group_anagrams.go rename to group_anagrams.go diff --git a/blind75/longest_consecutive_sequence.go b/longest_consecutive_sequence.go similarity index 100% rename from blind75/longest_consecutive_sequence.go rename to longest_consecutive_sequence.go diff --git a/blind75/merge_two_sorted_lists.go b/merge_two_sorted_lists.go similarity index 100% rename from blind75/merge_two_sorted_lists.go rename to merge_two_sorted_lists.go diff --git a/blind75/product_of_array_except_self.go b/product_of_array_except_self.go similarity index 100% rename from blind75/product_of_array_except_self.go rename to product_of_array_except_self.go diff --git a/blind75/top_k_frequent_elements.go b/top_k_frequent_elements.go similarity index 100% rename from blind75/top_k_frequent_elements.go rename to top_k_frequent_elements.go diff --git a/blind75/two_sum.go b/two_sum.go similarity index 100% rename from blind75/two_sum.go rename to two_sum.go diff --git a/blind75/valid_anagram.go b/valid_anagram.go similarity index 100% rename from blind75/valid_anagram.go rename to valid_anagram.go diff --git a/blind75/valid_anagram_followup.go b/valid_anagram_another_solution.go similarity index 100% rename from blind75/valid_anagram_followup.go rename to valid_anagram_another_solution.go diff --git a/blind75/valid_parentheses.go b/valid_parentheses.go similarity index 100% rename from blind75/valid_parentheses.go rename to valid_parentheses.go From af410409356eeadfd3a8a310b46e352c5d0588b9 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 11 Feb 2024 01:39:18 +0900 Subject: [PATCH 037/396] Update readme --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 1a8a55d..7248dd2 100644 --- a/README.md +++ b/README.md @@ -1 +1,9 @@ # leetcode + +This repository contains / will contain the solutions to the problems on LeetCode. + +## Problem Sets +- [ ] [Grind 75](https://www.techinterviewhandbook.org/grind75) +- [ ] [Blind 75](https://leetcode.com/discuss/general-discussion/460599/blind-75-leetcode-questions) +- [ ] [Arai 60](https://1kohei1.com/leetcode/) +- [ ] [NeetCode 150](https://neetcode.io/) From 6f0eb81f3aa36ce324249e0f6c862fd91367fd9b Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 12 Feb 2024 14:47:45 +0900 Subject: [PATCH 038/396] refactor merge two sorted lists --- merge_two_sorted_lists.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/merge_two_sorted_lists.go b/merge_two_sorted_lists.go index effa042..17e771c 100644 --- a/merge_two_sorted_lists.go +++ b/merge_two_sorted_lists.go @@ -20,12 +20,12 @@ func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode { cur = cur.Next } - if list1 == nil { - cur.Next = list2 - } - if list2 == nil { + if list1 != nil { cur.Next = list1 } + if list2 != nil { + cur.Next = list2 + } return dummy.Next } From cea6bc8f4da6747534b899f782f39ff202fbef87 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 12 Feb 2024 15:46:58 +0900 Subject: [PATCH 039/396] Create go dir --- contains_duplicate.go => go/contains_duplicate.go | 0 .../contains_duplicate_another_solution.go | 0 group_anagrams.go => go/group_anagrams.go | 0 .../longest_consecutive_sequence.go | 0 merge_two_sorted_lists.go => go/merge_two_sorted_lists.go | 0 .../product_of_array_except_self.go | 0 top_k_frequent_elements.go => go/top_k_frequent_elements.go | 0 two_sum.go => go/two_sum.go | 0 valid_anagram.go => go/valid_anagram.go | 0 .../valid_anagram_another_solution.go | 0 valid_parentheses.go => go/valid_parentheses.go | 0 11 files changed, 0 insertions(+), 0 deletions(-) rename contains_duplicate.go => go/contains_duplicate.go (100%) rename contains_duplicate_another_solution.go => go/contains_duplicate_another_solution.go (100%) rename group_anagrams.go => go/group_anagrams.go (100%) rename longest_consecutive_sequence.go => go/longest_consecutive_sequence.go (100%) rename merge_two_sorted_lists.go => go/merge_two_sorted_lists.go (100%) rename product_of_array_except_self.go => go/product_of_array_except_self.go (100%) rename top_k_frequent_elements.go => go/top_k_frequent_elements.go (100%) rename two_sum.go => go/two_sum.go (100%) rename valid_anagram.go => go/valid_anagram.go (100%) rename valid_anagram_another_solution.go => go/valid_anagram_another_solution.go (100%) rename valid_parentheses.go => go/valid_parentheses.go (100%) diff --git a/contains_duplicate.go b/go/contains_duplicate.go similarity index 100% rename from contains_duplicate.go rename to go/contains_duplicate.go diff --git a/contains_duplicate_another_solution.go b/go/contains_duplicate_another_solution.go similarity index 100% rename from contains_duplicate_another_solution.go rename to go/contains_duplicate_another_solution.go diff --git a/group_anagrams.go b/go/group_anagrams.go similarity index 100% rename from group_anagrams.go rename to go/group_anagrams.go diff --git a/longest_consecutive_sequence.go b/go/longest_consecutive_sequence.go similarity index 100% rename from longest_consecutive_sequence.go rename to go/longest_consecutive_sequence.go diff --git a/merge_two_sorted_lists.go b/go/merge_two_sorted_lists.go similarity index 100% rename from merge_two_sorted_lists.go rename to go/merge_two_sorted_lists.go diff --git a/product_of_array_except_self.go b/go/product_of_array_except_self.go similarity index 100% rename from product_of_array_except_self.go rename to go/product_of_array_except_self.go diff --git a/top_k_frequent_elements.go b/go/top_k_frequent_elements.go similarity index 100% rename from top_k_frequent_elements.go rename to go/top_k_frequent_elements.go diff --git a/two_sum.go b/go/two_sum.go similarity index 100% rename from two_sum.go rename to go/two_sum.go diff --git a/valid_anagram.go b/go/valid_anagram.go similarity index 100% rename from valid_anagram.go rename to go/valid_anagram.go diff --git a/valid_anagram_another_solution.go b/go/valid_anagram_another_solution.go similarity index 100% rename from valid_anagram_another_solution.go rename to go/valid_anagram_another_solution.go diff --git a/valid_parentheses.go b/go/valid_parentheses.go similarity index 100% rename from valid_parentheses.go rename to go/valid_parentheses.go From 9bc2c03b8f64999f8bfac7114ba59ac5d5c64ecd Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 12 Feb 2024 15:48:53 +0900 Subject: [PATCH 040/396] create go dir --- go.mod => go/go.mod | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename go.mod => go/go.mod (100%) diff --git a/go.mod b/go/go.mod similarity index 100% rename from go.mod rename to go/go.mod From d8b7913d39ef74dc48f68ec4d0bf2f40f47dee12 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 12 Feb 2024 17:12:25 +0900 Subject: [PATCH 041/396] submit best time to buy and sell stock --- go/best_time_to_buy_and_sell_stock.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 go/best_time_to_buy_and_sell_stock.go diff --git a/go/best_time_to_buy_and_sell_stock.go b/go/best_time_to_buy_and_sell_stock.go new file mode 100644 index 0000000..eb80938 --- /dev/null +++ b/go/best_time_to_buy_and_sell_stock.go @@ -0,0 +1,21 @@ +package blind75 + +import "math" + +func maxProfit(prices []int) int { + maxProfit := 0 + min := math.MaxUint32 + + for _, price := range prices { + if price <= min { + min = price + continue + } + + if price-min > maxProfit { + maxProfit = price - min + } + } + + return maxProfit +} From c909cdec98fb630818470e7c013a3c1576d7bdc6 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 12 Feb 2024 17:26:52 +0900 Subject: [PATCH 042/396] refactor best time to buy and self stock --- go/best_time_to_buy_and_sell_stock.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/go/best_time_to_buy_and_sell_stock.go b/go/best_time_to_buy_and_sell_stock.go index eb80938..42c410b 100644 --- a/go/best_time_to_buy_and_sell_stock.go +++ b/go/best_time_to_buy_and_sell_stock.go @@ -3,7 +3,7 @@ package blind75 import "math" func maxProfit(prices []int) int { - maxProfit := 0 + res := 0 min := math.MaxUint32 for _, price := range prices { @@ -12,10 +12,10 @@ func maxProfit(prices []int) int { continue } - if price-min > maxProfit { - maxProfit = price - min + if price-min > res { + res = price - min } } - return maxProfit + return res } From 731d38ab07b7f46fcd9dbd91af6795c17d25e742 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 12 Feb 2024 17:43:01 +0900 Subject: [PATCH 043/396] refactor best time to buy and sell stock --- go/best_time_to_buy_and_sell_stock.go | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/go/best_time_to_buy_and_sell_stock.go b/go/best_time_to_buy_and_sell_stock.go index 42c410b..b35c740 100644 --- a/go/best_time_to_buy_and_sell_stock.go +++ b/go/best_time_to_buy_and_sell_stock.go @@ -4,17 +4,11 @@ import "math" func maxProfit(prices []int) int { res := 0 - min := math.MaxUint32 + minPrice := math.MaxUint32 for _, price := range prices { - if price <= min { - min = price - continue - } - - if price-min > res { - res = price - min - } + minPrice = min(price, minPrice) + res = max(price-minPrice, res) } return res From 5266a51a8bedaa132f2329d3dfdaea3addd194d8 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 12 Feb 2024 18:26:59 +0900 Subject: [PATCH 044/396] submit valid palindrome --- go/valid_palindrome.go | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 go/valid_palindrome.go diff --git a/go/valid_palindrome.go b/go/valid_palindrome.go new file mode 100644 index 0000000..095f981 --- /dev/null +++ b/go/valid_palindrome.go @@ -0,0 +1,38 @@ +package blind75 + +func isPalindrome(s string) bool { + i := 0 + j := len(s) - 1 + for { + if i >= j { + return true + } + + if !(('A' <= s[i] && s[i] <= 'Z') || ('a' <= s[i] && s[i] <= 'z') || ('0' <= s[i] && s[i] <= '9')) { + i++ + continue + } + if !(('A' <= s[j] && s[j] <= 'Z') || ('a' <= s[j] && s[j] <= 'z') || ('0' <= s[j] && s[j] <= '9')) { + j-- + continue + } + + if s[i] != s[j] { + si := s[i] + sj := s[j] + if 'A' <= s[i] && s[i] <= 'Z' { + si = s[i] - 'A' + 'a' + } + if 'A' <= s[j] && s[j] <= 'Z' { + sj = s[j] - 'A' + 'a' + } + + if si != sj { + return false + } + } + + i++ + j-- + } +} From 2eaae56182a7caeaa3e55ace9536306ec93394f7 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 12 Feb 2024 20:44:11 +0900 Subject: [PATCH 045/396] refactor valid palindrome --- go/valid_palindrome.go | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/go/valid_palindrome.go b/go/valid_palindrome.go index 095f981..9067966 100644 --- a/go/valid_palindrome.go +++ b/go/valid_palindrome.go @@ -1,38 +1,29 @@ package blind75 +import "unicode" + func isPalindrome(s string) bool { i := 0 j := len(s) - 1 - for { - if i >= j { - return true - } + for i < j { + si := rune(s[i]) + sj := rune(s[j]) - if !(('A' <= s[i] && s[i] <= 'Z') || ('a' <= s[i] && s[i] <= 'z') || ('0' <= s[i] && s[i] <= '9')) { + if !(unicode.IsLetter(si) || unicode.IsDigit(si)) { i++ continue } - if !(('A' <= s[j] && s[j] <= 'Z') || ('a' <= s[j] && s[j] <= 'z') || ('0' <= s[j] && s[j] <= '9')) { + if !(unicode.IsLetter(sj) || unicode.IsDigit(sj)) { j-- continue } - if s[i] != s[j] { - si := s[i] - sj := s[j] - if 'A' <= s[i] && s[i] <= 'Z' { - si = s[i] - 'A' + 'a' - } - if 'A' <= s[j] && s[j] <= 'Z' { - sj = s[j] - 'A' + 'a' - } - - if si != sj { - return false - } + if unicode.ToLower(si) != unicode.ToLower(sj) { + return false } i++ j-- } + return true } From 5025643bd0f1eefc56c928d5a1e366153937c8bb Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 12 Feb 2024 20:46:30 +0900 Subject: [PATCH 046/396] refactor valid palindrome --- go/valid_palindrome.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/go/valid_palindrome.go b/go/valid_palindrome.go index 9067966..a7317c8 100644 --- a/go/valid_palindrome.go +++ b/go/valid_palindrome.go @@ -6,19 +6,19 @@ func isPalindrome(s string) bool { i := 0 j := len(s) - 1 for i < j { - si := rune(s[i]) - sj := rune(s[j]) + ri := rune(s[i]) + rj := rune(s[j]) - if !(unicode.IsLetter(si) || unicode.IsDigit(si)) { + if !(unicode.IsLetter(ri) || unicode.IsDigit(ri)) { i++ continue } - if !(unicode.IsLetter(sj) || unicode.IsDigit(sj)) { + if !(unicode.IsLetter(rj) || unicode.IsDigit(rj)) { j-- continue } - if unicode.ToLower(si) != unicode.ToLower(sj) { + if unicode.ToLower(ri) != unicode.ToLower(rj) { return false } From 68d6e20392bebe58666583d4662597c07076c945 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 12 Feb 2024 21:09:32 +0900 Subject: [PATCH 047/396] refactor valid palindrome --- go/valid_palindrome.go | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/go/valid_palindrome.go b/go/valid_palindrome.go index a7317c8..afd8e98 100644 --- a/go/valid_palindrome.go +++ b/go/valid_palindrome.go @@ -3,22 +3,20 @@ package blind75 import "unicode" func isPalindrome(s string) bool { + r := []rune(s) i := 0 - j := len(s) - 1 + j := len(r) - 1 for i < j { - ri := rune(s[i]) - rj := rune(s[j]) - - if !(unicode.IsLetter(ri) || unicode.IsDigit(ri)) { + if !(unicode.IsLetter(r[i]) || unicode.IsDigit(r[i])) { i++ continue } - if !(unicode.IsLetter(rj) || unicode.IsDigit(rj)) { + if !(unicode.IsLetter(r[j]) || unicode.IsDigit(r[j])) { j-- continue } - if unicode.ToLower(ri) != unicode.ToLower(rj) { + if unicode.ToLower(r[i]) != unicode.ToLower(r[j]) { return false } From 0644e1c1d009c2ce03b2894d25cb3dd98ac31a48 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 12 Feb 2024 23:47:31 +0900 Subject: [PATCH 048/396] submit invert binary tree --- go/invert_binary_tree.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 go/invert_binary_tree.go diff --git a/go/invert_binary_tree.go b/go/invert_binary_tree.go new file mode 100644 index 0000000..e0ed4d4 --- /dev/null +++ b/go/invert_binary_tree.go @@ -0,0 +1,18 @@ +package blind75 + +type TreeNode struct { + Val int + Left *TreeNode + Right *TreeNode +} + +func invertTree(root *TreeNode) *TreeNode { + if root == nil { + return root + } + + tmp := root.Left + root.Left = invertTree(root.Right) + root.Right = invertTree(tmp) + return root +} From 70b50531907ed3e89af0722bbd10922ac7e2d3d7 Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 13 Feb 2024 00:08:00 +0900 Subject: [PATCH 049/396] refactor invert binary tree --- go/invert_binary_tree.go | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/go/invert_binary_tree.go b/go/invert_binary_tree.go index e0ed4d4..be7e141 100644 --- a/go/invert_binary_tree.go +++ b/go/invert_binary_tree.go @@ -7,12 +7,10 @@ type TreeNode struct { } func invertTree(root *TreeNode) *TreeNode { - if root == nil { - return root + if root != nil { + tmp := root.Left + root.Left = invertTree(root.Right) + root.Right = invertTree(tmp) } - - tmp := root.Left - root.Left = invertTree(root.Right) - root.Right = invertTree(tmp) return root } From 53cc5df63641ee07497fe47baca948f19d18de3c Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 13 Feb 2024 00:32:51 +0900 Subject: [PATCH 050/396] submit binary search --- go/binary_search.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 go/binary_search.go diff --git a/go/binary_search.go b/go/binary_search.go new file mode 100644 index 0000000..52c80fc --- /dev/null +++ b/go/binary_search.go @@ -0,0 +1,17 @@ +package blind75 + +func search(nums []int, target int) int { + left := 0 + right := len(nums) - 1 + for left <= right { + mid := (left + right) / 2 + if target < nums[mid] { + right = mid - 1 + } else if nums[mid] < target { + left = mid + 1 + } else { + return mid + } + } + return -1 +} From ae39e6aa28dc1debc58ac62b3586c0f0c88fa22b Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 15 Feb 2024 19:22:05 +0900 Subject: [PATCH 051/396] refactor best time to buy and sell stock --- go/best_time_to_buy_and_sell_stock.go | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/go/best_time_to_buy_and_sell_stock.go b/go/best_time_to_buy_and_sell_stock.go index b35c740..bd9b7a8 100644 --- a/go/best_time_to_buy_and_sell_stock.go +++ b/go/best_time_to_buy_and_sell_stock.go @@ -4,12 +4,10 @@ import "math" func maxProfit(prices []int) int { res := 0 - minPrice := math.MaxUint32 - + minProfit := math.MaxUint32 for _, price := range prices { - minPrice = min(price, minPrice) - res = max(price-minPrice, res) + res = max(res, price-minProfit) + minProfit = min(minProfit, price) } - return res } From a1df1370890ad2377f3a6d52186a55649056142c Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 15 Feb 2024 21:10:57 +0900 Subject: [PATCH 052/396] refactor contains duplicate --- go/contains_duplicate.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/go/contains_duplicate.go b/go/contains_duplicate.go index e02e71b..13a70f7 100644 --- a/go/contains_duplicate.go +++ b/go/contains_duplicate.go @@ -1,10 +1,6 @@ package blind75 func containsDuplicate(nums []int) bool { - if len(nums) <= 1 { - return false - } - m := make(map[int]struct{}) for _, n := range nums { if _, ok := m[n]; ok { From aa56c29bde64a4172c3e36f795a137250f7be4cb Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 15 Feb 2024 21:17:07 +0900 Subject: [PATCH 053/396] refactor contains duplicate another solution --- go/contains_duplicate_another_solution.go | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/go/contains_duplicate_another_solution.go b/go/contains_duplicate_another_solution.go index 4ca3233..17f7c3f 100644 --- a/go/contains_duplicate_another_solution.go +++ b/go/contains_duplicate_another_solution.go @@ -1,16 +1,11 @@ package blind75 func containsDuplicate2(nums []int) bool { - if len(nums) <= 1 { - return false - } - m := make(map[int]struct{}) for _, n := range nums { m[n] = struct{}{} } - - if len(nums) != len(m) { + if len(nums) > len(m) { return true } return false From 6ac5033aec5a997b3624609674b792567a1f2a2e Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 15 Feb 2024 21:39:37 +0900 Subject: [PATCH 054/396] refactor valid anagram another solution --- go/valid_anagram_another_solution.go | 1 - 1 file changed, 1 deletion(-) diff --git a/go/valid_anagram_another_solution.go b/go/valid_anagram_another_solution.go index 47afeb7..175f08a 100644 --- a/go/valid_anagram_another_solution.go +++ b/go/valid_anagram_another_solution.go @@ -9,7 +9,6 @@ func isAnagram_unicode(s string, t string) bool { for _, r := range s { freq[r]++ } - for _, r := range t { freq[r]-- if freq[r] < 0 { From defbf98520319a706a83351445d318a7f2a4e0c4 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 18 Feb 2024 20:25:51 +0900 Subject: [PATCH 055/396] update go.mod --- go/go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/go.mod b/go/go.mod index d322c78..845e1f1 100644 --- a/go/go.mod +++ b/go/go.mod @@ -1,3 +1,3 @@ -module neetcode +module github.com/rihib/leetcode/go go 1.21.5 From cf510f7cf48f6fb373f58010efb35a526d29713d Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 18 Feb 2024 20:36:38 +0900 Subject: [PATCH 056/396] refactor merge two sorted lists --- go/merge_two_sorted_lists.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/merge_two_sorted_lists.go b/go/merge_two_sorted_lists.go index 17e771c..31cf57f 100644 --- a/go/merge_two_sorted_lists.go +++ b/go/merge_two_sorted_lists.go @@ -10,7 +10,7 @@ func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode { cur := dummy for list1 != nil && list2 != nil { - if list1.Val <= list2.Val { + if list1.Val < list2.Val { cur.Next = list1 list1 = list1.Next } else { From e659a871a82e48da7c80dcd931e2f4802e0cd662 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 18 Feb 2024 20:54:01 +0900 Subject: [PATCH 057/396] add comments to ignore all unused funcs --- go/best_time_to_buy_and_sell_stock.go | 1 + go/binary_search.go | 1 + go/contains_duplicate.go | 1 + go/contains_duplicate_another_solution.go | 1 + go/group_anagrams.go | 1 + go/invert_binary_tree.go | 1 + go/longest_consecutive_sequence.go | 1 + go/merge_two_sorted_lists.go | 1 + go/product_of_array_except_self.go | 1 + go/top_k_frequent_elements.go | 1 + go/two_sum.go | 1 + go/valid_anagram.go | 1 + go/valid_anagram_another_solution.go | 1 + go/valid_palindrome.go | 1 + go/valid_parentheses.go | 1 + 15 files changed, 15 insertions(+) diff --git a/go/best_time_to_buy_and_sell_stock.go b/go/best_time_to_buy_and_sell_stock.go index bd9b7a8..cfefa26 100644 --- a/go/best_time_to_buy_and_sell_stock.go +++ b/go/best_time_to_buy_and_sell_stock.go @@ -1,3 +1,4 @@ +//lint:file-ignore U1000 Ignore all unused code package blind75 import "math" diff --git a/go/binary_search.go b/go/binary_search.go index 52c80fc..46184fa 100644 --- a/go/binary_search.go +++ b/go/binary_search.go @@ -1,3 +1,4 @@ +//lint:file-ignore U1000 Ignore all unused code package blind75 func search(nums []int, target int) int { diff --git a/go/contains_duplicate.go b/go/contains_duplicate.go index 13a70f7..c2ef35e 100644 --- a/go/contains_duplicate.go +++ b/go/contains_duplicate.go @@ -1,3 +1,4 @@ +//lint:file-ignore U1000 Ignore all unused code package blind75 func containsDuplicate(nums []int) bool { diff --git a/go/contains_duplicate_another_solution.go b/go/contains_duplicate_another_solution.go index 17f7c3f..ef03f23 100644 --- a/go/contains_duplicate_another_solution.go +++ b/go/contains_duplicate_another_solution.go @@ -1,3 +1,4 @@ +//lint:file-ignore U1000 Ignore all unused code package blind75 func containsDuplicate2(nums []int) bool { diff --git a/go/group_anagrams.go b/go/group_anagrams.go index 5b0b787..19f788f 100644 --- a/go/group_anagrams.go +++ b/go/group_anagrams.go @@ -1,3 +1,4 @@ +//lint:file-ignore U1000 Ignore all unused code package blind75 func groupAnagrams(strs []string) [][]string { diff --git a/go/invert_binary_tree.go b/go/invert_binary_tree.go index be7e141..aee0a52 100644 --- a/go/invert_binary_tree.go +++ b/go/invert_binary_tree.go @@ -1,3 +1,4 @@ +//lint:file-ignore U1000 Ignore all unused code package blind75 type TreeNode struct { diff --git a/go/longest_consecutive_sequence.go b/go/longest_consecutive_sequence.go index cd61f54..d240ab3 100644 --- a/go/longest_consecutive_sequence.go +++ b/go/longest_consecutive_sequence.go @@ -1,3 +1,4 @@ +//lint:file-ignore U1000 Ignore all unused code package blind75 func longestConsecutive(nums []int) int { diff --git a/go/merge_two_sorted_lists.go b/go/merge_two_sorted_lists.go index 31cf57f..a6d9869 100644 --- a/go/merge_two_sorted_lists.go +++ b/go/merge_two_sorted_lists.go @@ -1,3 +1,4 @@ +//lint:file-ignore U1000 Ignore all unused code package blind75 type ListNode struct { diff --git a/go/product_of_array_except_self.go b/go/product_of_array_except_self.go index ca5eab2..38b7961 100644 --- a/go/product_of_array_except_self.go +++ b/go/product_of_array_except_self.go @@ -1,3 +1,4 @@ +//lint:file-ignore U1000 Ignore all unused code package blind75 func productExceptSelf(nums []int) []int { diff --git a/go/top_k_frequent_elements.go b/go/top_k_frequent_elements.go index 4b3565f..a78dbf0 100644 --- a/go/top_k_frequent_elements.go +++ b/go/top_k_frequent_elements.go @@ -1,3 +1,4 @@ +//lint:file-ignore U1000 Ignore all unused code package blind75 func topKFrequent(nums []int, k int) []int { diff --git a/go/two_sum.go b/go/two_sum.go index 28bbefa..b301cf4 100644 --- a/go/two_sum.go +++ b/go/two_sum.go @@ -1,3 +1,4 @@ +//lint:file-ignore U1000 Ignore all unused code package blind75 func twoSum(nums []int, target int) []int { diff --git a/go/valid_anagram.go b/go/valid_anagram.go index 9992edc..e534b21 100644 --- a/go/valid_anagram.go +++ b/go/valid_anagram.go @@ -1,3 +1,4 @@ +//lint:file-ignore U1000 Ignore all unused code package blind75 func isAnagram(s string, t string) bool { diff --git a/go/valid_anagram_another_solution.go b/go/valid_anagram_another_solution.go index 175f08a..6d11e19 100644 --- a/go/valid_anagram_another_solution.go +++ b/go/valid_anagram_another_solution.go @@ -1,3 +1,4 @@ +//lint:file-ignore U1000 Ignore all unused code package blind75 func isAnagram_unicode(s string, t string) bool { diff --git a/go/valid_palindrome.go b/go/valid_palindrome.go index afd8e98..22268d2 100644 --- a/go/valid_palindrome.go +++ b/go/valid_palindrome.go @@ -1,3 +1,4 @@ +//lint:file-ignore U1000 Ignore all unused code package blind75 import "unicode" diff --git a/go/valid_parentheses.go b/go/valid_parentheses.go index 83bdff8..e87ed67 100644 --- a/go/valid_parentheses.go +++ b/go/valid_parentheses.go @@ -1,3 +1,4 @@ +//lint:file-ignore U1000 Ignore all unused code package blind75 func isValid(s string) bool { From 8ba7c14baa9685112a9185ecbf1c26fa423e2db3 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 18 Feb 2024 21:25:01 +0900 Subject: [PATCH 058/396] refactor contains duplicate another solution --- go/contains_duplicate_another_solution.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/go/contains_duplicate_another_solution.go b/go/contains_duplicate_another_solution.go index ef03f23..a53f739 100644 --- a/go/contains_duplicate_another_solution.go +++ b/go/contains_duplicate_another_solution.go @@ -6,8 +6,5 @@ func containsDuplicate2(nums []int) bool { for _, n := range nums { m[n] = struct{}{} } - if len(nums) > len(m) { - return true - } - return false + return len(nums) > len(m) } From fda68d30c518d2d77da763e5833906d604a53059 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 19 Feb 2024 00:27:02 +0900 Subject: [PATCH 059/396] create flood fill and it works but it exceed memory limit when submit to leetcode --- go/best_time_to_buy_and_sell_stock.go | 2 +- go/binary_search.go | 2 +- go/contains_duplicate.go | 2 +- go/contains_duplicate_another_solution.go | 2 +- go/flood_fill.go | 20 ++++++++++++++++++++ go/group_anagrams.go | 2 +- go/invert_binary_tree.go | 2 +- go/longest_consecutive_sequence.go | 2 +- go/main.go | 12 ++++++++++++ go/merge_two_sorted_lists.go | 2 +- go/product_of_array_except_self.go | 2 +- go/top_k_frequent_elements.go | 2 +- go/two_sum.go | 2 +- go/valid_anagram.go | 2 +- go/valid_anagram_another_solution.go | 2 +- go/valid_palindrome.go | 2 +- go/valid_parentheses.go | 2 +- 17 files changed, 47 insertions(+), 15 deletions(-) create mode 100644 go/flood_fill.go create mode 100644 go/main.go diff --git a/go/best_time_to_buy_and_sell_stock.go b/go/best_time_to_buy_and_sell_stock.go index cfefa26..88a2834 100644 --- a/go/best_time_to_buy_and_sell_stock.go +++ b/go/best_time_to_buy_and_sell_stock.go @@ -1,5 +1,5 @@ //lint:file-ignore U1000 Ignore all unused code -package blind75 +package main import "math" diff --git a/go/binary_search.go b/go/binary_search.go index 46184fa..2e44f9d 100644 --- a/go/binary_search.go +++ b/go/binary_search.go @@ -1,5 +1,5 @@ //lint:file-ignore U1000 Ignore all unused code -package blind75 +package main func search(nums []int, target int) int { left := 0 diff --git a/go/contains_duplicate.go b/go/contains_duplicate.go index c2ef35e..df42a80 100644 --- a/go/contains_duplicate.go +++ b/go/contains_duplicate.go @@ -1,5 +1,5 @@ //lint:file-ignore U1000 Ignore all unused code -package blind75 +package main func containsDuplicate(nums []int) bool { m := make(map[int]struct{}) diff --git a/go/contains_duplicate_another_solution.go b/go/contains_duplicate_another_solution.go index a53f739..873b3c6 100644 --- a/go/contains_duplicate_another_solution.go +++ b/go/contains_duplicate_another_solution.go @@ -1,5 +1,5 @@ //lint:file-ignore U1000 Ignore all unused code -package blind75 +package main func containsDuplicate2(nums []int) bool { m := make(map[int]struct{}) diff --git a/go/flood_fill.go b/go/flood_fill.go new file mode 100644 index 0000000..f0d9973 --- /dev/null +++ b/go/flood_fill.go @@ -0,0 +1,20 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +func floodFill(image [][]int, sr int, sc int, color int) [][]int { + originalColor := image[sr][sc] + image[sr][sc] = color + if 0 <= sr-1 && image[sr-1][sc] == originalColor { + image = floodFill(image, sr-1, sc, color) + } + if sr+1 < len(image[sr]) && image[sr+1][sc] == originalColor { + image = floodFill(image, sr+1, sc, color) + } + if 0 <= sc-1 && image[sr][sc-1] == originalColor { + image = floodFill(image, sr, sc-1, color) + } + if sc+1 < len(image[sr]) && image[sr][sc+1] == originalColor { + image = floodFill(image, sr, sc+1, color) + } + return image +} diff --git a/go/group_anagrams.go b/go/group_anagrams.go index 19f788f..7bf1317 100644 --- a/go/group_anagrams.go +++ b/go/group_anagrams.go @@ -1,5 +1,5 @@ //lint:file-ignore U1000 Ignore all unused code -package blind75 +package main func groupAnagrams(strs []string) [][]string { m := make(map[[26]int][]string) diff --git a/go/invert_binary_tree.go b/go/invert_binary_tree.go index aee0a52..6623833 100644 --- a/go/invert_binary_tree.go +++ b/go/invert_binary_tree.go @@ -1,5 +1,5 @@ //lint:file-ignore U1000 Ignore all unused code -package blind75 +package main type TreeNode struct { Val int diff --git a/go/longest_consecutive_sequence.go b/go/longest_consecutive_sequence.go index d240ab3..f6ad99a 100644 --- a/go/longest_consecutive_sequence.go +++ b/go/longest_consecutive_sequence.go @@ -1,5 +1,5 @@ //lint:file-ignore U1000 Ignore all unused code -package blind75 +package main func longestConsecutive(nums []int) int { m := make(map[int]struct{}) diff --git a/go/main.go b/go/main.go new file mode 100644 index 0000000..d6b9a54 --- /dev/null +++ b/go/main.go @@ -0,0 +1,12 @@ +package main + +import "fmt" + +func main() { + image := floodFill([][]int{{1, 1, 1}, {1, 1, 0}, {1, 0, 1}}, 1, 1, 2) + for _, v := range image { + for _, b := range v { + fmt.Println(b) + } + } +} diff --git a/go/merge_two_sorted_lists.go b/go/merge_two_sorted_lists.go index a6d9869..7325d39 100644 --- a/go/merge_two_sorted_lists.go +++ b/go/merge_two_sorted_lists.go @@ -1,5 +1,5 @@ //lint:file-ignore U1000 Ignore all unused code -package blind75 +package main type ListNode struct { Val int diff --git a/go/product_of_array_except_self.go b/go/product_of_array_except_self.go index 38b7961..5760107 100644 --- a/go/product_of_array_except_self.go +++ b/go/product_of_array_except_self.go @@ -1,5 +1,5 @@ //lint:file-ignore U1000 Ignore all unused code -package blind75 +package main func productExceptSelf(nums []int) []int { res := make([]int, len(nums)) diff --git a/go/top_k_frequent_elements.go b/go/top_k_frequent_elements.go index a78dbf0..81dacc5 100644 --- a/go/top_k_frequent_elements.go +++ b/go/top_k_frequent_elements.go @@ -1,5 +1,5 @@ //lint:file-ignore U1000 Ignore all unused code -package blind75 +package main func topKFrequent(nums []int, k int) []int { freq := make(map[int]int) diff --git a/go/two_sum.go b/go/two_sum.go index b301cf4..67d45f7 100644 --- a/go/two_sum.go +++ b/go/two_sum.go @@ -1,5 +1,5 @@ //lint:file-ignore U1000 Ignore all unused code -package blind75 +package main func twoSum(nums []int, target int) []int { m := make(map[int]int) diff --git a/go/valid_anagram.go b/go/valid_anagram.go index e534b21..9dfbdaf 100644 --- a/go/valid_anagram.go +++ b/go/valid_anagram.go @@ -1,5 +1,5 @@ //lint:file-ignore U1000 Ignore all unused code -package blind75 +package main func isAnagram(s string, t string) bool { if len(s) != len(t) { diff --git a/go/valid_anagram_another_solution.go b/go/valid_anagram_another_solution.go index 6d11e19..2c3419a 100644 --- a/go/valid_anagram_another_solution.go +++ b/go/valid_anagram_another_solution.go @@ -1,5 +1,5 @@ //lint:file-ignore U1000 Ignore all unused code -package blind75 +package main func isAnagram_unicode(s string, t string) bool { if len(s) != len(t) { diff --git a/go/valid_palindrome.go b/go/valid_palindrome.go index 22268d2..8843e94 100644 --- a/go/valid_palindrome.go +++ b/go/valid_palindrome.go @@ -1,5 +1,5 @@ //lint:file-ignore U1000 Ignore all unused code -package blind75 +package main import "unicode" diff --git a/go/valid_parentheses.go b/go/valid_parentheses.go index e87ed67..8d199cc 100644 --- a/go/valid_parentheses.go +++ b/go/valid_parentheses.go @@ -1,5 +1,5 @@ //lint:file-ignore U1000 Ignore all unused code -package blind75 +package main func isValid(s string) bool { brackets := map[rune]rune{')': '(', '}': '{', ']': '['} From 871185f2f82b5d106b8000168c164b0945288c60 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 19 Feb 2024 01:02:16 +0900 Subject: [PATCH 060/396] submit flood fill --- go/flood_fill.go | 6 +++++- go/main.go | 7 +------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/go/flood_fill.go b/go/flood_fill.go index f0d9973..1e7e25a 100644 --- a/go/flood_fill.go +++ b/go/flood_fill.go @@ -3,11 +3,15 @@ package main func floodFill(image [][]int, sr int, sc int, color int) [][]int { originalColor := image[sr][sc] + if originalColor == color { + return image + } + image[sr][sc] = color if 0 <= sr-1 && image[sr-1][sc] == originalColor { image = floodFill(image, sr-1, sc, color) } - if sr+1 < len(image[sr]) && image[sr+1][sc] == originalColor { + if sr+1 < len(image) && image[sr+1][sc] == originalColor { image = floodFill(image, sr+1, sc, color) } if 0 <= sc-1 && image[sr][sc-1] == originalColor { diff --git a/go/main.go b/go/main.go index d6b9a54..a3dd973 100644 --- a/go/main.go +++ b/go/main.go @@ -3,10 +3,5 @@ package main import "fmt" func main() { - image := floodFill([][]int{{1, 1, 1}, {1, 1, 0}, {1, 0, 1}}, 1, 1, 2) - for _, v := range image { - for _, b := range v { - fmt.Println(b) - } - } + fmt.Println("Hello, World!") } From 82fc8279814b35795d5300d8f87809e7068a688a Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 19 Feb 2024 01:51:37 +0900 Subject: [PATCH 061/396] refactor --- go/best_time_to_buy_and_sell_stock.go | 6 ++---- go/binary_search.go | 3 +-- go/invert_binary_tree.go | 3 +-- go/valid_palindrome.go | 3 +-- 4 files changed, 5 insertions(+), 10 deletions(-) diff --git a/go/best_time_to_buy_and_sell_stock.go b/go/best_time_to_buy_and_sell_stock.go index 88a2834..177f6a1 100644 --- a/go/best_time_to_buy_and_sell_stock.go +++ b/go/best_time_to_buy_and_sell_stock.go @@ -4,11 +4,9 @@ package main import "math" func maxProfit(prices []int) int { - res := 0 - minProfit := math.MaxUint32 + res, minProfit := 0, math.MaxUint32 for _, price := range prices { - res = max(res, price-minProfit) - minProfit = min(minProfit, price) + res, minProfit = max(res, price-minProfit), min(minProfit, price) } return res } diff --git a/go/binary_search.go b/go/binary_search.go index 2e44f9d..89da515 100644 --- a/go/binary_search.go +++ b/go/binary_search.go @@ -2,8 +2,7 @@ package main func search(nums []int, target int) int { - left := 0 - right := len(nums) - 1 + left, right := 0, len(nums)-1 for left <= right { mid := (left + right) / 2 if target < nums[mid] { diff --git a/go/invert_binary_tree.go b/go/invert_binary_tree.go index 6623833..5cbdc95 100644 --- a/go/invert_binary_tree.go +++ b/go/invert_binary_tree.go @@ -10,8 +10,7 @@ type TreeNode struct { func invertTree(root *TreeNode) *TreeNode { if root != nil { tmp := root.Left - root.Left = invertTree(root.Right) - root.Right = invertTree(tmp) + root.Left, root.Right = invertTree(root.Right), invertTree(tmp) } return root } diff --git a/go/valid_palindrome.go b/go/valid_palindrome.go index 8843e94..2334588 100644 --- a/go/valid_palindrome.go +++ b/go/valid_palindrome.go @@ -5,8 +5,7 @@ import "unicode" func isPalindrome(s string) bool { r := []rune(s) - i := 0 - j := len(r) - 1 + i, j := 0, len(r)-1 for i < j { if !(unicode.IsLetter(r[i]) || unicode.IsDigit(r[i])) { i++ From e64fa956dd7b4feefdf765283d74e603247cd040 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 19 Feb 2024 02:06:35 +0900 Subject: [PATCH 062/396] refactor flood fill --- .vscode/settings.json | 1 + go/flood_fill.go | 23 +++++++++++------------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 757d081..9c1b310 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -5,4 +5,5 @@ "markdown": true, "scminput": false }, + "editor.wordWrap": "wordWrapColumn" } diff --git a/go/flood_fill.go b/go/flood_fill.go index 1e7e25a..c744357 100644 --- a/go/flood_fill.go +++ b/go/flood_fill.go @@ -3,22 +3,21 @@ package main func floodFill(image [][]int, sr int, sc int, color int) [][]int { originalColor := image[sr][sc] + if originalColor == color { return image } - image[sr][sc] = color - if 0 <= sr-1 && image[sr-1][sc] == originalColor { - image = floodFill(image, sr-1, sc, color) - } - if sr+1 < len(image) && image[sr+1][sc] == originalColor { - image = floodFill(image, sr+1, sc, color) - } - if 0 <= sc-1 && image[sr][sc-1] == originalColor { - image = floodFill(image, sr, sc-1, color) - } - if sc+1 < len(image[sr]) && image[sr][sc+1] == originalColor { - image = floodFill(image, sr, sc+1, color) + + directions := [][]int{{-1, 0}, {1, 0}, {0, -1}, {0, 1}} + for _, d := range directions { + nSr, nSc := sr+d[0], sc+d[1] + if 0 <= nSr && nSr < len(image) && + 0 <= nSc && nSc < len(image[0]) && + image[nSr][nSc] == originalColor { + image = floodFill(image, nSr, nSc, color) + } } + return image } From 3af62c4f2dc4a8493ed8707968d751fc2274bada Mon Sep 17 00:00:00 2001 From: rihib Date: Wed, 13 Mar 2024 13:26:46 +0900 Subject: [PATCH 063/396] create code.txt for text editor --- code.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 code.txt diff --git a/code.txt b/code.txt new file mode 100644 index 0000000..e69de29 From 93e85b095013d867918b1b6e74b4bbb53dcaaa60 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 14 Apr 2024 23:09:08 +0900 Subject: [PATCH 064/396] Lowest Common Ancestor of a Binary Search Tree --- go/common.go | 7 +++++++ go/invert_binary_tree.go | 6 ------ ...west_common_ancester_of_a_binary_search_tree.go | 14 ++++++++++++++ 3 files changed, 21 insertions(+), 6 deletions(-) create mode 100644 go/common.go create mode 100644 go/lowest_common_ancester_of_a_binary_search_tree.go diff --git a/go/common.go b/go/common.go new file mode 100644 index 0000000..1778343 --- /dev/null +++ b/go/common.go @@ -0,0 +1,7 @@ +package main + +type TreeNode struct { + Val int + Left *TreeNode + Right *TreeNode +} diff --git a/go/invert_binary_tree.go b/go/invert_binary_tree.go index 5cbdc95..4a1f40f 100644 --- a/go/invert_binary_tree.go +++ b/go/invert_binary_tree.go @@ -1,12 +1,6 @@ //lint:file-ignore U1000 Ignore all unused code package main -type TreeNode struct { - Val int - Left *TreeNode - Right *TreeNode -} - func invertTree(root *TreeNode) *TreeNode { if root != nil { tmp := root.Left diff --git a/go/lowest_common_ancester_of_a_binary_search_tree.go b/go/lowest_common_ancester_of_a_binary_search_tree.go new file mode 100644 index 0000000..410cc70 --- /dev/null +++ b/go/lowest_common_ancester_of_a_binary_search_tree.go @@ -0,0 +1,14 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode { + if p.Val < root.Val && q.Val < root.Val { + return lowestCommonAncestor(root.Left, p, q) + } + + if p.Val > root.Val && q.Val > root.Val { + return lowestCommonAncestor(root.Right, p, q) + } + + return root +} From b564291f026197a5652fa5cc4c772f097e426ae6 Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 16 Apr 2024 01:01:37 +0900 Subject: [PATCH 065/396] Balanced Binary Tree --- go/balanced_binary_tree.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 go/balanced_binary_tree.go diff --git a/go/balanced_binary_tree.go b/go/balanced_binary_tree.go new file mode 100644 index 0000000..1ee07b7 --- /dev/null +++ b/go/balanced_binary_tree.go @@ -0,0 +1,26 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +import "math" + +type TreeBalance struct { + IsBalanced bool + Height int +} + +func isBalanced(root *TreeNode) bool { + return dfs(root).IsBalanced +} + +func dfs(root *TreeNode) TreeBalance { + if root == nil { + return TreeBalance{true, 0} + } + + l, r := dfs(root.Left), dfs(root.Right) + b := (l.IsBalanced && + r.IsBalanced && + (int(math.Abs(float64(l.Height)-float64(r.Height))) <= 1)) + h := max(l.Height, r.Height) + 1 + return TreeBalance{b, h} +} From 8472c12e7a142b077c9e34010701fb0c8822aa7c Mon Sep 17 00:00:00 2001 From: rihib Date: Wed, 17 Apr 2024 00:44:56 +0900 Subject: [PATCH 066/396] Linked List Cycle --- go/common.go | 5 +++++ go/linked_list_cycle.go | 19 +++++++++++++++++++ go/merge_two_sorted_lists.go | 5 ----- 3 files changed, 24 insertions(+), 5 deletions(-) create mode 100644 go/linked_list_cycle.go diff --git a/go/common.go b/go/common.go index 1778343..2c9a2e9 100644 --- a/go/common.go +++ b/go/common.go @@ -1,5 +1,10 @@ package main +type ListNode struct { + Val int + Next *ListNode +} + type TreeNode struct { Val int Left *TreeNode diff --git a/go/linked_list_cycle.go b/go/linked_list_cycle.go new file mode 100644 index 0000000..331d6c1 --- /dev/null +++ b/go/linked_list_cycle.go @@ -0,0 +1,19 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +func hasCycle(head *ListNode) bool { + if head == nil || head.Next == nil { + return false + } + + turtle, rabbit := head.Next, head.Next.Next + for turtle != rabbit { + if rabbit == nil || rabbit.Next == nil { + return false + } + + turtle = turtle.Next + rabbit = rabbit.Next.Next + } + return true +} diff --git a/go/merge_two_sorted_lists.go b/go/merge_two_sorted_lists.go index 7325d39..34798ff 100644 --- a/go/merge_two_sorted_lists.go +++ b/go/merge_two_sorted_lists.go @@ -1,11 +1,6 @@ //lint:file-ignore U1000 Ignore all unused code package main -type ListNode struct { - Val int - Next *ListNode -} - func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode { dummy := new(ListNode) cur := dummy From a61a89a451f3eb6621ca411f779ef509cbfb5bb7 Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 18 Apr 2024 10:08:23 +0900 Subject: [PATCH 067/396] Implement Queue Using Stacks --- go/implement_queue_using_stacks.go | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 go/implement_queue_using_stacks.go diff --git a/go/implement_queue_using_stacks.go b/go/implement_queue_using_stacks.go new file mode 100644 index 0000000..fc7fb21 --- /dev/null +++ b/go/implement_queue_using_stacks.go @@ -0,0 +1,28 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +type MyQueue struct { + Queue []int +} + +func Constructor() MyQueue { + return MyQueue{} +} + +func (q *MyQueue) Push(x int) { + q.Queue = append(q.Queue, x) +} + +func (q *MyQueue) Pop() int { + x := q.Queue[0] + q.Queue = q.Queue[1:] + return x +} + +func (q *MyQueue) Peek() int { + return q.Queue[0] +} + +func (q *MyQueue) Empty() bool { + return len(q.Queue) == 0 +} From 431cfa37c411c2d536ed07792f6ef1196865f77e Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 18 Apr 2024 14:10:13 +0900 Subject: [PATCH 068/396] another solution: Implement Queue Using Stack --- go/implement_queue_using_stacks1.go | 41 +++++++++++++++++++ ...ks.go => implement_queue_using_stacks2.go} | 14 +++---- 2 files changed, 48 insertions(+), 7 deletions(-) create mode 100644 go/implement_queue_using_stacks1.go rename go/{implement_queue_using_stacks.go => implement_queue_using_stacks2.go} (51%) diff --git a/go/implement_queue_using_stacks1.go b/go/implement_queue_using_stacks1.go new file mode 100644 index 0000000..0be760b --- /dev/null +++ b/go/implement_queue_using_stacks1.go @@ -0,0 +1,41 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +type MyQueue struct { + InputStack []int + OutputStack []int +} + +func Constructor() MyQueue { + return MyQueue{} +} + +func (q *MyQueue) Push(x int) { + q.InputStack = append(q.InputStack, x) +} + +func (q *MyQueue) Pop() int { + tail := q.Peek() + q.OutputStack = q.OutputStack[:len(q.OutputStack)-1] + return tail +} + +func (q *MyQueue) Peek() int { + if q.Empty() { + return -1 + } + + if len(q.OutputStack) == 0 { + for len(q.InputStack) > 0 { + tail := q.InputStack[len(q.InputStack)-1] + q.InputStack = q.InputStack[:len(q.InputStack)-1] + q.OutputStack = append(q.OutputStack, tail) + } + } + + return q.OutputStack[len(q.OutputStack)-1] +} + +func (q *MyQueue) Empty() bool { + return len(q.InputStack) == 0 && len(q.OutputStack) == 0 +} diff --git a/go/implement_queue_using_stacks.go b/go/implement_queue_using_stacks2.go similarity index 51% rename from go/implement_queue_using_stacks.go rename to go/implement_queue_using_stacks2.go index fc7fb21..cad5534 100644 --- a/go/implement_queue_using_stacks.go +++ b/go/implement_queue_using_stacks2.go @@ -1,28 +1,28 @@ //lint:file-ignore U1000 Ignore all unused code package main -type MyQueue struct { +type MyQueue2 struct { Queue []int } -func Constructor() MyQueue { - return MyQueue{} +func Constructor2() MyQueue2 { + return MyQueue2{} } -func (q *MyQueue) Push(x int) { +func (q *MyQueue2) Push(x int) { q.Queue = append(q.Queue, x) } -func (q *MyQueue) Pop() int { +func (q *MyQueue2) Pop() int { x := q.Queue[0] q.Queue = q.Queue[1:] return x } -func (q *MyQueue) Peek() int { +func (q *MyQueue2) Peek() int { return q.Queue[0] } -func (q *MyQueue) Empty() bool { +func (q *MyQueue2) Empty() bool { return len(q.Queue) == 0 } From b807fe9300902b58b2fc39d16632a40db22bbe81 Mon Sep 17 00:00:00 2001 From: rihib Date: Fri, 19 Apr 2024 10:28:08 +0900 Subject: [PATCH 069/396] First Bad Version --- go/first_bad_version.go | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 go/first_bad_version.go diff --git a/go/first_bad_version.go b/go/first_bad_version.go new file mode 100644 index 0000000..81bd44f --- /dev/null +++ b/go/first_bad_version.go @@ -0,0 +1,23 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +const BadVersion = 4 + +func isBadVersion(version int) bool { + return version == BadVersion +} + +func firstBadVersion(n int) int { + fbv := n + h, t := 1, n + for h <= t { + mid := (h + t) / 2 + if isBadVersion(mid) { + fbv = mid + t = mid - 1 + } else { + h = mid + 1 + } + } + return fbv +} From 28441eb439e221494d43253cc5612b092b1c6973 Mon Sep 17 00:00:00 2001 From: rihib Date: Fri, 19 Apr 2024 11:28:42 +0900 Subject: [PATCH 070/396] refactor(first bad version) --- go/first_bad_version.go | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/go/first_bad_version.go b/go/first_bad_version.go index 81bd44f..8623c6b 100644 --- a/go/first_bad_version.go +++ b/go/first_bad_version.go @@ -8,16 +8,14 @@ func isBadVersion(version int) bool { } func firstBadVersion(n int) int { - fbv := n - h, t := 1, n - for h <= t { - mid := (h + t) / 2 + l, r := 1, n + for l < r { + mid := (l + r) / 2 if isBadVersion(mid) { - fbv = mid - t = mid - 1 + r = mid } else { - h = mid + 1 + l = mid + 1 } } - return fbv + return l } From ff31aafc2c61b52154aa77811618318731ec995b Mon Sep 17 00:00:00 2001 From: rihib Date: Fri, 19 Apr 2024 12:38:31 +0900 Subject: [PATCH 071/396] Ransom Note --- go/ransom_note.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 go/ransom_note.go diff --git a/go/ransom_note.go b/go/ransom_note.go new file mode 100644 index 0000000..fabb8fd --- /dev/null +++ b/go/ransom_note.go @@ -0,0 +1,18 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +func canConstruct(ransomNote string, magazine string) bool { + var l [26]int + + for _, r := range magazine { + l[r-'a']++ + } + + for _, r := range ransomNote { + if l[r-'a'] <= 0 { + return false + } + l[r-'a']-- + } + return true +} From 9077dd043a0fd675e8217aa36f1307984723d5c6 Mon Sep 17 00:00:00 2001 From: rihib Date: Fri, 19 Apr 2024 15:15:36 +0900 Subject: [PATCH 072/396] Climbing Stairs --- go/climbing_stairs.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 go/climbing_stairs.go diff --git a/go/climbing_stairs.go b/go/climbing_stairs.go new file mode 100644 index 0000000..8b6e82c --- /dev/null +++ b/go/climbing_stairs.go @@ -0,0 +1,18 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +var mem map[int]int = map[int]int{} + +func climbStairs(n int) int { + if n == 1 { + return 1 + } else if n == 2 { + return 2 + } else if val, ok := mem[n]; ok { + return val + } + + ways := climbStairs(n-1) + climbStairs(n-2) + mem[n] = ways + return ways +} From 745edc0657c0fe637a91b1a3c2f45acae296050a Mon Sep 17 00:00:00 2001 From: rihib Date: Fri, 19 Apr 2024 15:58:56 +0900 Subject: [PATCH 073/396] refactor Climbing Stairs --- go/climbing_stairs.go | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/go/climbing_stairs.go b/go/climbing_stairs.go index 8b6e82c..b5d2307 100644 --- a/go/climbing_stairs.go +++ b/go/climbing_stairs.go @@ -1,18 +1,10 @@ //lint:file-ignore U1000 Ignore all unused code package main -var mem map[int]int = map[int]int{} - func climbStairs(n int) int { - if n == 1 { - return 1 - } else if n == 2 { - return 2 - } else if val, ok := mem[n]; ok { - return val + prev, curr := 0, 1 + for i := 1; i <= n; i++ { + prev, curr = curr, prev+curr } - - ways := climbStairs(n-1) + climbStairs(n-2) - mem[n] = ways - return ways + return curr } From 12508b376147a1c45d91571b493e60f1ede3bd1b Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 20 Apr 2024 12:54:35 +0900 Subject: [PATCH 074/396] Longest Palindrome --- go/longest_palindrome.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 go/longest_palindrome.go diff --git a/go/longest_palindrome.go b/go/longest_palindrome.go new file mode 100644 index 0000000..9677559 --- /dev/null +++ b/go/longest_palindrome.go @@ -0,0 +1,22 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +func longestPalindrome(s string) int { + m := make(map[rune]struct{}) + l := 0 + + for _, r := range s { + if _, ok := m[r]; ok { + delete(m, r) + l += 2 + } else { + m[r] = struct{}{} + } + } + + if len(m) > 0 { + l++ + } + + return l +} From 7e99da84fd23a95dfef4b49548aee83a1edb7539 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 21 Apr 2024 14:51:45 +0900 Subject: [PATCH 075/396] refactor Valid Parentheses --- go/valid_parentheses.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/go/valid_parentheses.go b/go/valid_parentheses.go index 8d199cc..d83cdbb 100644 --- a/go/valid_parentheses.go +++ b/go/valid_parentheses.go @@ -2,11 +2,11 @@ package main func isValid(s string) bool { - brackets := map[rune]rune{')': '(', '}': '{', ']': '['} + p := map[rune]rune{')': '(', '}': '{', ']': '['} var stack []rune for _, r := range s { - v, ok := brackets[r] + v, ok := p[r] if !ok { stack = append(stack, r) From 0c5c360be8045b66063bd4064f21f35128456d04 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 21 Apr 2024 15:27:19 +0900 Subject: [PATCH 076/396] refactor Lowest Common Ancester of a Binary Search Tree --- go/lowest_common_ancester_of_a_binary_search_tree.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/lowest_common_ancester_of_a_binary_search_tree.go b/go/lowest_common_ancester_of_a_binary_search_tree.go index 410cc70..af2a5a4 100644 --- a/go/lowest_common_ancester_of_a_binary_search_tree.go +++ b/go/lowest_common_ancester_of_a_binary_search_tree.go @@ -6,7 +6,7 @@ func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode { return lowestCommonAncestor(root.Left, p, q) } - if p.Val > root.Val && q.Val > root.Val { + if root.Val < p.Val && root.Val < q.Val { return lowestCommonAncestor(root.Right, p, q) } From 70aa4c8f86b356fd5742c26f8253212dc035d170 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 21 Apr 2024 16:07:46 +0900 Subject: [PATCH 077/396] refactor Balanced Binary Tree --- go/balanced_binary_tree.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/go/balanced_binary_tree.go b/go/balanced_binary_tree.go index 1ee07b7..abd4ad6 100644 --- a/go/balanced_binary_tree.go +++ b/go/balanced_binary_tree.go @@ -9,18 +9,18 @@ type TreeBalance struct { } func isBalanced(root *TreeNode) bool { - return dfs(root).IsBalanced + return traversal(root).IsBalanced } -func dfs(root *TreeNode) TreeBalance { +func traversal(root *TreeNode) TreeBalance { if root == nil { return TreeBalance{true, 0} } - l, r := dfs(root.Left), dfs(root.Right) - b := (l.IsBalanced && + l, r := traversal(root.Left), traversal(root.Right) + b := l.IsBalanced && r.IsBalanced && - (int(math.Abs(float64(l.Height)-float64(r.Height))) <= 1)) + (int(math.Abs(float64(l.Height)-float64(r.Height))) <= 1) h := max(l.Height, r.Height) + 1 return TreeBalance{b, h} } From a07b9cb03b77bcf86732696b1e4088a11ed2e8fc Mon Sep 17 00:00:00 2001 From: rihib Date: Wed, 1 May 2024 13:32:28 +0900 Subject: [PATCH 078/396] create Reverse Linked List --- go/reverse_linked_list.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 go/reverse_linked_list.go diff --git a/go/reverse_linked_list.go b/go/reverse_linked_list.go new file mode 100644 index 0000000..3679200 --- /dev/null +++ b/go/reverse_linked_list.go @@ -0,0 +1,24 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +func reverseList(head *ListNode) *ListNode { + // Test Case: [], [1], [1, 2], [1, 2, 3], [1, 2, 3, 4] + if head == nil { + return head + } + if head.Next == nil { + return head + } + + prev := head + next := head.Next + head.Next = nil + + for next != nil { + nextNext := next.Next + next.Next = prev + prev = next + next = nextNext + } + return prev +} From 0d075b0379115a0b3f6034d8fea5e285a10d70d0 Mon Sep 17 00:00:00 2001 From: rihib Date: Wed, 1 May 2024 14:04:11 +0900 Subject: [PATCH 079/396] refactor Reverse Linked List1 --- ...erse_linked_list.go => reverse_linked_list1.go} | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) rename go/{reverse_linked_list.go => reverse_linked_list1.go} (60%) diff --git a/go/reverse_linked_list.go b/go/reverse_linked_list1.go similarity index 60% rename from go/reverse_linked_list.go rename to go/reverse_linked_list1.go index 3679200..f118890 100644 --- a/go/reverse_linked_list.go +++ b/go/reverse_linked_list1.go @@ -1,7 +1,7 @@ //lint:file-ignore U1000 Ignore all unused code package main -func reverseList(head *ListNode) *ListNode { +func reverseList1(head *ListNode) *ListNode { // Test Case: [], [1], [1, 2], [1, 2, 3], [1, 2, 3, 4] if head == nil { return head @@ -11,14 +11,14 @@ func reverseList(head *ListNode) *ListNode { } prev := head - next := head.Next + curr := head.Next head.Next = nil - for next != nil { - nextNext := next.Next - next.Next = prev - prev = next - next = nextNext + for curr != nil { + next := curr.Next + curr.Next = prev + prev = curr + curr = next } return prev } From 5c9ef4e39743c982c30d634f9c2e52f5ad67d3c2 Mon Sep 17 00:00:00 2001 From: rihib Date: Wed, 1 May 2024 14:19:42 +0900 Subject: [PATCH 080/396] refactor Reverse Linked List --- go/reverse_linked_list1.go | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/go/reverse_linked_list1.go b/go/reverse_linked_list1.go index f118890..760de39 100644 --- a/go/reverse_linked_list1.go +++ b/go/reverse_linked_list1.go @@ -3,16 +3,8 @@ package main func reverseList1(head *ListNode) *ListNode { // Test Case: [], [1], [1, 2], [1, 2, 3], [1, 2, 3, 4] - if head == nil { - return head - } - if head.Next == nil { - return head - } - - prev := head - curr := head.Next - head.Next = nil + var prev *ListNode + curr := head for curr != nil { next := curr.Next @@ -20,5 +12,6 @@ func reverseList1(head *ListNode) *ListNode { prev = curr curr = next } + return prev } From e0cf2d527beb8757a75576e5a6262e91a3b6d211 Mon Sep 17 00:00:00 2001 From: rihib Date: Wed, 1 May 2024 14:36:02 +0900 Subject: [PATCH 081/396] create Reverse Linked List 2 --- go/reverse_linked_list2.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 go/reverse_linked_list2.go diff --git a/go/reverse_linked_list2.go b/go/reverse_linked_list2.go new file mode 100644 index 0000000..899d1c4 --- /dev/null +++ b/go/reverse_linked_list2.go @@ -0,0 +1,14 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +func reverseList2(head *ListNode) *ListNode { + // Test Case: [], [1], [1, 2], [1, 2, 3], [1, 2, 3, 4] + if head == nil || head.Next == nil { + return head + } + + next := head.Next + reversedListHead := reverseList2(next) + next.Next, head.Next = head, nil + return reversedListHead +} From 80f1637b9bff4a04b68b320d26bce27807a9bac3 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 4 May 2024 17:43:20 +0900 Subject: [PATCH 082/396] create Majority Element --- go/majority_element.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 go/majority_element.go diff --git a/go/majority_element.go b/go/majority_element.go new file mode 100644 index 0000000..259ee2d --- /dev/null +++ b/go/majority_element.go @@ -0,0 +1,19 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +func majorityElement(nums []int) int { + candidate := nums[0] + cnt := 1 + for i := 1; i < len(nums); i++ { + if nums[i] == candidate { + cnt++ + } else { + cnt-- + if cnt == 0 { + candidate = nums[i] + cnt = 1 + } + } + } + return candidate +} From d05dc5d7621a829376f40733cb498dd595f1cda1 Mon Sep 17 00:00:00 2001 From: rihib <76939037+rihib@users.noreply.github.com> Date: Thu, 16 May 2024 10:15:09 +0900 Subject: [PATCH 083/396] refactor climbing stairs --- go/climbing_stairs.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/climbing_stairs.go b/go/climbing_stairs.go index b5d2307..8e04f44 100644 --- a/go/climbing_stairs.go +++ b/go/climbing_stairs.go @@ -3,7 +3,7 @@ package main func climbStairs(n int) int { prev, curr := 0, 1 - for i := 1; i <= n; i++ { + for i := 0; i < n; i++ { prev, curr = curr, prev+curr } return curr From b0cce31e2ebfad313d926ad5f581a78bf1eed664 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 20 May 2024 13:07:30 +0900 Subject: [PATCH 084/396] refactor Best Time to Buy and Sell Stock --- go/best_time_to_buy_and_sell_stock.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/go/best_time_to_buy_and_sell_stock.go b/go/best_time_to_buy_and_sell_stock.go index 177f6a1..cf15041 100644 --- a/go/best_time_to_buy_and_sell_stock.go +++ b/go/best_time_to_buy_and_sell_stock.go @@ -1,12 +1,12 @@ //lint:file-ignore U1000 Ignore all unused code package main -import "math" - func maxProfit(prices []int) int { - res, minProfit := 0, math.MaxUint32 - for _, price := range prices { - res, minProfit = max(res, price-minProfit), min(minProfit, price) + res := 0 + minProfit := prices[0] + for i := 0; i < len(prices); i++ { + res = max(res, prices[i]-minProfit) + minProfit = min(minProfit, prices[i]) } return res } From 84e6d49c6d421264d4972d4f4c7deab0f935a57c Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 3 Jun 2024 19:52:47 +0900 Subject: [PATCH 085/396] create Add Binary --- go/add_binary.go | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 go/add_binary.go diff --git a/go/add_binary.go b/go/add_binary.go new file mode 100644 index 0000000..bea621d --- /dev/null +++ b/go/add_binary.go @@ -0,0 +1,36 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +import ( + "slices" + "strings" +) + +func addBinary(a, b string) string { + // TestCase: [0, 1], [1, 1], [11, 1] + maxLen := max(len(a), len(b)) + var reversed_result strings.Builder + carry := 0 + + for i := 1; i <= maxLen; i++ { + a_bit, b_bit := 0, 0 + + if len(a) >= i { + a_bit = int(a[len(a)-i] - '0') + } + if len(b) >= i { + b_bit = int(b[len(b)-i] - '0') + } + + sum := a_bit + b_bit + carry + carry = sum / 2 + reversed_result.WriteByte(byte(sum%2) + '0') + } + if carry > 0 { + reversed_result.WriteByte(byte(carry) + '0') + } + + result := []rune(reversed_result.String()) + slices.Reverse(result) + return string(result) +} From 4693047e2dd6d78f637906f50331c46a17fa3659 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 3 Jun 2024 20:06:01 +0900 Subject: [PATCH 086/396] create Diameter of Binary Tree --- go/diameter_of_binary_tree.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 go/diameter_of_binary_tree.go diff --git a/go/diameter_of_binary_tree.go b/go/diameter_of_binary_tree.go new file mode 100644 index 0000000..231b3bb --- /dev/null +++ b/go/diameter_of_binary_tree.go @@ -0,0 +1,19 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +func diameterOfBinaryTree(root *TreeNode) int { + maxLength := 0 + getmaxLen(root, &maxLength) + return maxLength +} + +func getmaxLen(t *TreeNode, maxLength *int) int { + if t == nil { + return 0 + } + + left, right := getmaxLen(t.Left, maxLength), getmaxLen(t.Right, maxLength) + *maxLength = max(*maxLength, left+right) + + return max(left, right) + 1 +} From 0a073184c6ccb35d0182e8fab8fcf4cc1ba98ca3 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 3 Jun 2024 20:49:05 +0900 Subject: [PATCH 087/396] create Middle of the Linked List --- go/middle_of_the_linked_list.go | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 go/middle_of_the_linked_list.go diff --git a/go/middle_of_the_linked_list.go b/go/middle_of_the_linked_list.go new file mode 100644 index 0000000..6a0985f --- /dev/null +++ b/go/middle_of_the_linked_list.go @@ -0,0 +1,31 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +func middleNode(head *ListNode) *ListNode { + // TestCase: [], [1], [1, 2], [1, 2, 3], [1, 2, 3, 4] + if head == nil { + return nil + } + + l := getListLen(head) + mid_idx := l / 2 + mid := head + for i := 0; i < mid_idx; i++ { + mid = mid.Next + } + return mid +} + +func getListLen(head *ListNode) int { + if head == nil { + return 0 + } + + l := 0 + for head != nil { + l++ + head = head.Next + } + + return l +} From 0e0b316a8f342ff2f97d5e07081458f5438974b8 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 3 Jun 2024 20:52:58 +0900 Subject: [PATCH 088/396] refactor Middle of the Linked List --- go/middle_of_the_linked_list.go | 27 ++++++--------------------- 1 file changed, 6 insertions(+), 21 deletions(-) diff --git a/go/middle_of_the_linked_list.go b/go/middle_of_the_linked_list.go index 6a0985f..e84775f 100644 --- a/go/middle_of_the_linked_list.go +++ b/go/middle_of_the_linked_list.go @@ -2,30 +2,15 @@ package main func middleNode(head *ListNode) *ListNode { - // TestCase: [], [1], [1, 2], [1, 2, 3], [1, 2, 3, 4] - if head == nil { - return nil + if head == nil || head.Next == nil { + return head } - l := getListLen(head) - mid_idx := l / 2 - mid := head - for i := 0; i < mid_idx; i++ { - mid = mid.Next - } - return mid -} - -func getListLen(head *ListNode) int { - if head == nil { - return 0 - } + slow, fast := head, head - l := 0 - for head != nil { - l++ - head = head.Next + for fast != nil && fast.Next != nil { + slow, fast = slow.Next, fast.Next.Next } - return l + return slow } From 84a120d071cf954fd1b5ba5ba0cafe17a5a640a4 Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 4 Jun 2024 22:17:17 +0900 Subject: [PATCH 089/396] Maximum Depth of Binary Tree --- go/maximum_depth_of_binary_tree.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 go/maximum_depth_of_binary_tree.go diff --git a/go/maximum_depth_of_binary_tree.go b/go/maximum_depth_of_binary_tree.go new file mode 100644 index 0000000..2e52993 --- /dev/null +++ b/go/maximum_depth_of_binary_tree.go @@ -0,0 +1,12 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +func maxDepth(root *TreeNode) int { + // TestCase: [], [0], [0, 1], [0, 1, 2], [0, 1, null, 2] + if root == nil { + return 0 + } + + maxdepth := max(maxDepth(root.Left), maxDepth(root.Right)) + 1 + return maxdepth +} From 53ea448af1e05aa7f8ec385450c9cd9f09607e06 Mon Sep 17 00:00:00 2001 From: rihib Date: Wed, 5 Jun 2024 00:07:15 +0900 Subject: [PATCH 090/396] create Roman to Integer --- go/roman_to_integer.go | 72 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 go/roman_to_integer.go diff --git a/go/roman_to_integer.go b/go/roman_to_integer.go new file mode 100644 index 0000000..2e80a92 --- /dev/null +++ b/go/roman_to_integer.go @@ -0,0 +1,72 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +import ( + "log" +) + +func romanToInt(s string) int { + s_list := []rune(s) + result := 0 + + symbols := map[rune]int{ + 'I': 1, + 'V': 5, + 'X': 10, + 'L': 50, + 'C': 100, + 'D': 500, + 'M': 1000, + } + + for i := 0; i < len(s); i++ { + n, ok := symbols[s_list[i]] + + if !ok { + log.Fatal("Invalid symbol") + } + + if i+1 < len(s) { + if s_list[i] == 'I' { + if s_list[i+1] == 'V' { + result += 4 + i++ + continue + } + if s_list[i+1] == 'X' { + result += 9 + i++ + continue + } + } + if s_list[i] == 'X' { + if s_list[i+1] == 'L' { + result += 40 + i++ + continue + } + if s_list[i+1] == 'C' { + result += 90 + i++ + continue + } + } + if s_list[i] == 'C' { + if s_list[i+1] == 'D' { + result += 400 + i++ + continue + } + if s_list[i+1] == 'M' { + result += 900 + i++ + continue + } + } + } + + result += n + } + + return result +} From fa26dd140a76b2bea15d00dc5966bc1645f9c7f6 Mon Sep 17 00:00:00 2001 From: rihib Date: Wed, 5 Jun 2024 00:21:21 +0900 Subject: [PATCH 091/396] refactor Roman to Integer --- go/roman_to_integer.go | 80 ++++++++++++------------------------------ 1 file changed, 22 insertions(+), 58 deletions(-) diff --git a/go/roman_to_integer.go b/go/roman_to_integer.go index 2e80a92..1cdd419 100644 --- a/go/roman_to_integer.go +++ b/go/roman_to_integer.go @@ -1,71 +1,35 @@ //lint:file-ignore U1000 Ignore all unused code package main -import ( - "log" -) - func romanToInt(s string) int { - s_list := []rune(s) - result := 0 - - symbols := map[rune]int{ - 'I': 1, - 'V': 5, - 'X': 10, - 'L': 50, - 'C': 100, - 'D': 500, - 'M': 1000, + symbols := map[string]int{ + "I": 1, + "IV": 4, + "V": 5, + "IX": 9, + "X": 10, + "XL": 40, + "L": 50, + "XC": 90, + "C": 100, + "CD": 400, + "D": 500, + "CM": 900, + "M": 1000, } + result := 0 + runes := []rune(s) for i := 0; i < len(s); i++ { - n, ok := symbols[s_list[i]] - - if !ok { - log.Fatal("Invalid symbol") + if i+1 < len(runes) && symbols[string(runes[i:i+2])] != 0 { + result += symbols[string(runes[i:i+2])] + i++ + continue } - if i+1 < len(s) { - if s_list[i] == 'I' { - if s_list[i+1] == 'V' { - result += 4 - i++ - continue - } - if s_list[i+1] == 'X' { - result += 9 - i++ - continue - } - } - if s_list[i] == 'X' { - if s_list[i+1] == 'L' { - result += 40 - i++ - continue - } - if s_list[i+1] == 'C' { - result += 90 - i++ - continue - } - } - if s_list[i] == 'C' { - if s_list[i+1] == 'D' { - result += 400 - i++ - continue - } - if s_list[i+1] == 'M' { - result += 900 - i++ - continue - } - } + if symbols[string(runes[i])] != 0 { + result += symbols[string(runes[i])] } - - result += n } return result From 9b50cfcc8599dad556b68b1f4ffbf967ca0d61cf Mon Sep 17 00:00:00 2001 From: rihib Date: Wed, 5 Jun 2024 00:37:33 +0900 Subject: [PATCH 092/396] refactor roman to integer --- go/roman_to_integer.go | 39 +++++++++++++++------------------------ 1 file changed, 15 insertions(+), 24 deletions(-) diff --git a/go/roman_to_integer.go b/go/roman_to_integer.go index 1cdd419..5f7434a 100644 --- a/go/roman_to_integer.go +++ b/go/roman_to_integer.go @@ -3,34 +3,25 @@ package main func romanToInt(s string) int { symbols := map[string]int{ - "I": 1, - "IV": 4, - "V": 5, - "IX": 9, - "X": 10, - "XL": 40, - "L": 50, - "XC": 90, - "C": 100, - "CD": 400, - "D": 500, - "CM": 900, - "M": 1000, + "I": 1, + "V": 5, + "X": 10, + "L": 50, + "C": 100, + "D": 500, + "M": 1000, } - result := 0 + res := 0 runes := []rune(s) - for i := 0; i < len(s); i++ { - if i+1 < len(runes) && symbols[string(runes[i:i+2])] != 0 { - result += symbols[string(runes[i:i+2])] - i++ - continue - } - - if symbols[string(runes[i])] != 0 { - result += symbols[string(runes[i])] + for i := 0; i < len(runes); i++ { + if i+1 < len(runes) && + symbols[string(runes[i])] < symbols[string(runes[i+1])] { + res -= symbols[string(runes[i])] + } else { + res += symbols[string(runes[i])] } } - return result + return res } From 64262a3823a2c7015cba05c4aeefc7a0eec34816 Mon Sep 17 00:00:00 2001 From: rihib Date: Wed, 5 Jun 2024 17:34:50 +0900 Subject: [PATCH 093/396] refactor Longest Consecutive Sequence --- go/longest_consecutive_sequence.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/go/longest_consecutive_sequence.go b/go/longest_consecutive_sequence.go index f6ad99a..d975908 100644 --- a/go/longest_consecutive_sequence.go +++ b/go/longest_consecutive_sequence.go @@ -7,7 +7,7 @@ func longestConsecutive(nums []int) int { m[n] = struct{}{} } - max_len := 0 + maxLen := 0 for n := range m { if _, ok := m[n-1]; ok { continue @@ -15,13 +15,13 @@ func longestConsecutive(nums []int) int { for l := 1; ; l++ { if _, ok := m[n+l]; !ok { - if l > max_len { - max_len = l + if l > maxLen { + maxLen = l } break } } } - return max_len + return maxLen } From 34268179022843192302442c317ca20cb072e027 Mon Sep 17 00:00:00 2001 From: rihib Date: Wed, 5 Jun 2024 17:35:01 +0900 Subject: [PATCH 094/396] refactor Add Bnary --- go/add_binary.go | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/go/add_binary.go b/go/add_binary.go index bea621d..b005dec 100644 --- a/go/add_binary.go +++ b/go/add_binary.go @@ -9,28 +9,28 @@ import ( func addBinary(a, b string) string { // TestCase: [0, 1], [1, 1], [11, 1] maxLen := max(len(a), len(b)) - var reversed_result strings.Builder + var reversedRes strings.Builder carry := 0 for i := 1; i <= maxLen; i++ { - a_bit, b_bit := 0, 0 + bitA, bitB := 0, 0 if len(a) >= i { - a_bit = int(a[len(a)-i] - '0') + bitA = int(a[len(a)-i] - '0') } if len(b) >= i { - b_bit = int(b[len(b)-i] - '0') + bitB = int(b[len(b)-i] - '0') } - sum := a_bit + b_bit + carry + sum := bitA + bitB + carry carry = sum / 2 - reversed_result.WriteByte(byte(sum%2) + '0') + reversedRes.WriteByte(byte(sum%2) + '0') } if carry > 0 { - reversed_result.WriteByte(byte(carry) + '0') + reversedRes.WriteByte(byte(carry) + '0') } - result := []rune(reversed_result.String()) - slices.Reverse(result) - return string(result) + res := []rune(reversedRes.String()) + slices.Reverse(res) + return string(res) } From 8ee4d571c50fe08175933a2b311e4017142cc5ed Mon Sep 17 00:00:00 2001 From: rihib Date: Wed, 5 Jun 2024 17:52:44 +0900 Subject: [PATCH 095/396] create Backspace String Compare --- go/backspace_string_compare.go | 37 ++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 go/backspace_string_compare.go diff --git a/go/backspace_string_compare.go b/go/backspace_string_compare.go new file mode 100644 index 0000000..9a17c29 --- /dev/null +++ b/go/backspace_string_compare.go @@ -0,0 +1,37 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +func backspaceCompare(s string, t string) bool { + i, j := len(s)-1, len(t)-1 + sCnt, tCnt := 0, 0 + + for i >= 0 || j >= 0 { + i = nextIdx(s, i, &sCnt) + j = nextIdx(t, j, &tCnt) + + if i >= 0 && j >= 0 && s[i] != t[j] { + return false + } + if (i >= 0) != (j >= 0) { + return false + } + i-- + j-- + } + + return true +} + +func nextIdx(str string, idx int, cnt *int) int { + for idx >= 0 { + if str[idx] == '#' { + *cnt++ + } else if *cnt > 0 { + *cnt-- + } else { + break + } + idx-- + } + return idx +} From 56929b231eaa12956506279145020ac22e729b77 Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 6 Jun 2024 13:01:42 +0900 Subject: [PATCH 096/396] refactor Climbing Stairs --- go/climbing_stairs.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/go/climbing_stairs.go b/go/climbing_stairs.go index 8e04f44..9973bda 100644 --- a/go/climbing_stairs.go +++ b/go/climbing_stairs.go @@ -2,8 +2,8 @@ package main func climbStairs(n int) int { - prev, curr := 0, 1 - for i := 0; i < n; i++ { + prev, curr := 1, 1 + for i := 1; i < n; i++ { prev, curr = curr, prev+curr } return curr From c2f9403278cd10779168cf4af07056dcbb511183 Mon Sep 17 00:00:00 2001 From: rihib Date: Fri, 7 Jun 2024 09:51:14 +0900 Subject: [PATCH 097/396] create Counting Bits --- go/counting_bits.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 go/counting_bits.go diff --git a/go/counting_bits.go b/go/counting_bits.go new file mode 100644 index 0000000..1126956 --- /dev/null +++ b/go/counting_bits.go @@ -0,0 +1,14 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +func countBits(n int) []int { + res := make([]int, n+1) + powerOf2 := 1 + for i := 1; i <= n; i++ { + if powerOf2*2 == i { + powerOf2 = i + } + res[i] = 1 + res[i-powerOf2] + } + return res +} From 00e7e99d6b66d32ce76c7cb7da1c655c2d9bda61 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 9 Jun 2024 16:24:43 +0900 Subject: [PATCH 098/396] create Same Tree --- go/same_tree.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 go/same_tree.go diff --git a/go/same_tree.go b/go/same_tree.go new file mode 100644 index 0000000..58ee0b9 --- /dev/null +++ b/go/same_tree.go @@ -0,0 +1,22 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +func isSameTree(p *TreeNode, q *TreeNode) bool { + // TestCase: [[], []], [[1], []], [[1], [1]], [[1, 2, 3], [1, 2]] + if p == nil && q == nil { + return true + } + if p == nil && q != nil || p != nil && q == nil { + return false + } + + if p.Val != q.Val { + return false + } + + if !(isSameTree(p.Left, q.Left) && isSameTree(p.Right, q.Right)) { + return false + } + + return true +} From 5723c72f9ab000276c1a2b55f293a2a720fcfa01 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 9 Jun 2024 16:30:52 +0900 Subject: [PATCH 099/396] refactor Same Tree --- go/same_tree.go | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/go/same_tree.go b/go/same_tree.go index 58ee0b9..ed9f2ee 100644 --- a/go/same_tree.go +++ b/go/same_tree.go @@ -6,17 +6,10 @@ func isSameTree(p *TreeNode, q *TreeNode) bool { if p == nil && q == nil { return true } - if p == nil && q != nil || p != nil && q == nil { - return false - } - - if p.Val != q.Val { - return false - } - if !(isSameTree(p.Left, q.Left) && isSameTree(p.Right, q.Right)) { + if p == nil || q == nil || p.Val != q.Val { return false } - return true + return isSameTree(p.Left, q.Left) && isSameTree(p.Right, q.Right) } From af07e236300b3812680ce6a2f14e15524d46731e Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 9 Jun 2024 16:49:21 +0900 Subject: [PATCH 100/396] create Number of 1 Bits --- go/number_of_1bits.go | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 go/number_of_1bits.go diff --git a/go/number_of_1bits.go b/go/number_of_1bits.go new file mode 100644 index 0000000..4a29a0d --- /dev/null +++ b/go/number_of_1bits.go @@ -0,0 +1,11 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +func hammingWeight(n int) int { + cnt := 0 + for n > 0 { + cnt += n % 2 + n /= 2 + } + return cnt +} From bdb7eaa4928b15353fc760e29bf055f96788e564 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 9 Jun 2024 16:59:21 +0900 Subject: [PATCH 101/396] refactor Number of 1 Bits --- go/number_of_1bits.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/go/number_of_1bits.go b/go/number_of_1bits.go index 4a29a0d..5eb164a 100644 --- a/go/number_of_1bits.go +++ b/go/number_of_1bits.go @@ -4,8 +4,8 @@ package main func hammingWeight(n int) int { cnt := 0 for n > 0 { - cnt += n % 2 - n /= 2 + n &= n - 1 + cnt += 1 } return cnt } From 26ca1a8ba1ed5beb9198108bcbf5b777ef472d84 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 9 Jun 2024 18:54:30 +0900 Subject: [PATCH 102/396] create Longest Common Prefix --- go/longest_common_prefix.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 go/longest_common_prefix.go diff --git a/go/longest_common_prefix.go b/go/longest_common_prefix.go new file mode 100644 index 0000000..1c05692 --- /dev/null +++ b/go/longest_common_prefix.go @@ -0,0 +1,17 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +import "strings" + +func longestCommonPrefix(strs []string) string { + var prefix strings.Builder + for i := 0; i < len(strs[0]); i++ { + for _, word := range strs { + if i == len(word) || strs[0][i] != word[i] { + return prefix.String() + } + } + prefix.WriteByte(strs[0][i]) + } + return prefix.String() +} From dc0e1783c97d5ad069e713b82ad26482f5a51902 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 9 Jun 2024 18:54:56 +0900 Subject: [PATCH 103/396] refactor Longest Common Prefix --- go/longest_common_prefix.go | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/go/longest_common_prefix.go b/go/longest_common_prefix.go index 1c05692..6efdfa1 100644 --- a/go/longest_common_prefix.go +++ b/go/longest_common_prefix.go @@ -1,17 +1,18 @@ //lint:file-ignore U1000 Ignore all unused code package main -import "strings" +import "sort" func longestCommonPrefix(strs []string) string { - var prefix strings.Builder - for i := 0; i < len(strs[0]); i++ { - for _, word := range strs { - if i == len(word) || strs[0][i] != word[i] { - return prefix.String() - } + if len(strs) == 1 { + return strs[0] + } + + sort.Strings(strs) + for i := range strs[0] { + if strs[0][i] != strs[len(strs)-1][i] { + return strs[0][:i] } - prefix.WriteByte(strs[0][i]) } - return prefix.String() + return strs[0] } From 30cc1a95b32a7ea3fb2bf0b41298d2f706bca13d Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 9 Jun 2024 20:26:15 +0900 Subject: [PATCH 104/396] create Single Number --- go/single_number.go | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 go/single_number.go diff --git a/go/single_number.go b/go/single_number.go new file mode 100644 index 0000000..86b2e65 --- /dev/null +++ b/go/single_number.go @@ -0,0 +1,10 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +func singleNumber(nums []int) int { + res := 0 + for _, n := range nums { + res ^= n + } + return res +} From 1588a7d21a29cf4029f546b71b73a84f726c07ad Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 9 Jun 2024 21:14:59 +0900 Subject: [PATCH 105/396] create Palindrome Linked List --- go/palindrome_linked_list.go | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 go/palindrome_linked_list.go diff --git a/go/palindrome_linked_list.go b/go/palindrome_linked_list.go new file mode 100644 index 0000000..3eb6dc5 --- /dev/null +++ b/go/palindrome_linked_list.go @@ -0,0 +1,31 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +func isPalindromeLinkedList(head *ListNode) bool { + // TestCase: [], [1], [1, 1], [1, 2, 1], [1, 2, 2, 1] + if head == nil { + return true + } + + slow, fast := head, head + var val_list []int + + for fast != nil && fast.Next != nil { + val_list = append(val_list, slow.Val) + slow = slow.Next + fast = fast.Next.Next + } + + if fast != nil { + slow = slow.Next + } + + for i := len(val_list) - 1; i >= 0; i-- { + if slow == nil || val_list[i] != slow.Val { + return false + } + slow = slow.Next + } + + return true +} From 49eeb0638c6e533ef9ca6e112c81413228be5c18 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 9 Jun 2024 21:28:21 +0900 Subject: [PATCH 106/396] refactor Palindrome Linked List --- go/palindrome_linked_list.go | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/go/palindrome_linked_list.go b/go/palindrome_linked_list.go index 3eb6dc5..ebea2ab 100644 --- a/go/palindrome_linked_list.go +++ b/go/palindrome_linked_list.go @@ -2,29 +2,26 @@ package main func isPalindromeLinkedList(head *ListNode) bool { - // TestCase: [], [1], [1, 1], [1, 2, 1], [1, 2, 2, 1] - if head == nil { - return true - } - slow, fast := head, head - var val_list []int + var rev *ListNode for fast != nil && fast.Next != nil { - val_list = append(val_list, slow.Val) - slow = slow.Next fast = fast.Next.Next + tmp := slow.Next + slow.Next = rev + rev = slow + slow = tmp } if fast != nil { slow = slow.Next } - for i := len(val_list) - 1; i >= 0; i-- { - if slow == nil || val_list[i] != slow.Val { + for slow != nil { + if slow.Val != rev.Val { return false } - slow = slow.Next + slow, rev = slow.Next, rev.Next } return true From 97026a3ddbfc6ad7da79d4b5271a6d5982b4b492 Mon Sep 17 00:00:00 2001 From: rihib <76939037+rihib@users.noreply.github.com> Date: Mon, 10 Jun 2024 08:16:27 +0900 Subject: [PATCH 107/396] refactor add binary --- go/add_binary.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/add_binary.go b/go/add_binary.go index b005dec..c859f5a 100644 --- a/go/add_binary.go +++ b/go/add_binary.go @@ -8,8 +8,8 @@ import ( func addBinary(a, b string) string { // TestCase: [0, 1], [1, 1], [11, 1] - maxLen := max(len(a), len(b)) var reversedRes strings.Builder + maxLen := max(len(a), len(b)) carry := 0 for i := 1; i <= maxLen; i++ { From 5d4b275619e9995708fc60da715eb4ee6c4749a8 Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 11 Jun 2024 17:06:22 +0900 Subject: [PATCH 108/396] create Move Zeroes --- go/move_zeroes.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 go/move_zeroes.go diff --git a/go/move_zeroes.go b/go/move_zeroes.go new file mode 100644 index 0000000..511e5a8 --- /dev/null +++ b/go/move_zeroes.go @@ -0,0 +1,17 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +func moveZeroes(nums []int) { + for i, n := range nums { + if n == 0 { + for j := i + 1; j < len(nums); j++ { + if nums[j] != 0 { + tmp := nums[i] + nums[i] = nums[j] + nums[j] = tmp + break + } + } + } + } +} From 07bf4597e8ef984b8ca8fd83ebf9f5b07aae91e6 Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 11 Jun 2024 17:33:21 +0900 Subject: [PATCH 109/396] refactor Move Zeroes --- go/move_zeroes.go | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/go/move_zeroes.go b/go/move_zeroes.go index 511e5a8..b9745ae 100644 --- a/go/move_zeroes.go +++ b/go/move_zeroes.go @@ -2,16 +2,13 @@ package main func moveZeroes(nums []int) { + zeroIdx := 0 for i, n := range nums { - if n == 0 { - for j := i + 1; j < len(nums); j++ { - if nums[j] != 0 { - tmp := nums[i] - nums[i] = nums[j] - nums[j] = tmp - break - } + if n != 0 { + if i != zeroIdx { + nums[i], nums[zeroIdx] = nums[zeroIdx], nums[i] } + zeroIdx++ } } } From af6ed9b152b469c5c82aa11bfb7797b103e6cc3e Mon Sep 17 00:00:00 2001 From: rihib Date: Wed, 12 Jun 2024 12:20:56 +0900 Subject: [PATCH 110/396] create Symmetric Tree --- go/symmetric_tree.go | 51 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 go/symmetric_tree.go diff --git a/go/symmetric_tree.go b/go/symmetric_tree.go new file mode 100644 index 0000000..ea4b6a2 --- /dev/null +++ b/go/symmetric_tree.go @@ -0,0 +1,51 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +import "container/list" + +func isSymmetric_recursive(root *TreeNode) bool { + if root == nil { + return true + } + return isMirror(root.Left, root.Right) +} + +func isMirror(t1, t2 *TreeNode) bool { + if t1 == nil && t2 == nil { + return true + } + if t1 == nil || t2 == nil { + return false + } + return (t1.Val == t2.Val) && + isMirror(t1.Left, t2.Right) && isMirror(t1.Right, t2.Left) +} + +func isSymmetric_iterative(root *TreeNode) bool { + if root == nil { + return true + } + + queue := list.New() + queue.PushBack(root.Left) + queue.PushBack(root.Right) + + for queue.Len() > 0 { + t1 := queue.Remove(queue.Front()).(*TreeNode) + t2 := queue.Remove(queue.Front()).(*TreeNode) + + if t1 == nil && t2 == nil { + continue + } + if t1 == nil || t2 == nil || t1.Val != t2.Val { + return false + } + + queue.PushBack(t1.Left) + queue.PushBack(t2.Right) + queue.PushBack(t1.Right) + queue.PushBack(t2.Left) + } + + return true +} From ae7efa57ead89d10e8e7388a41471182d8606ed6 Mon Sep 17 00:00:00 2001 From: rihib Date: Wed, 12 Jun 2024 14:51:42 +0900 Subject: [PATCH 111/396] create Missing Number --- go/missing_number.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 go/missing_number.go diff --git a/go/missing_number.go b/go/missing_number.go new file mode 100644 index 0000000..f5ea6e3 --- /dev/null +++ b/go/missing_number.go @@ -0,0 +1,19 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +func missingNumber(nums []int) int { + sum := 0 + for _, n := range nums { + sum += n + } + l := len(nums) + return l*(l+1)/2 - sum +} + +func missingNumber2(nums []int) int { + res := len(nums) + for i, n := range nums { + res += i - n + } + return res +} From da459f39fc0fc8f9dee8202fc44c54c2f16548bc Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 13 Jun 2024 00:39:07 +0900 Subject: [PATCH 112/396] create Palindrome Number --- go/palindrome_number.go | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 go/palindrome_number.go diff --git a/go/palindrome_number.go b/go/palindrome_number.go new file mode 100644 index 0000000..9d0deb3 --- /dev/null +++ b/go/palindrome_number.go @@ -0,0 +1,33 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +func isPalindromeNumber(x int) bool { + // TestCase: -1, 0, 1, 12, 121, 1231 + + if x < 0 { + return false + } + if x <= 9 { + return true + } + + var nums []int + for x > 0 { + nums = append(nums, x%10) + x /= 10 + } + + for i, n := range nums { + j := len(nums) - 1 - i + + if i >= j { + break + } + + if n != nums[j] { + return false + } + } + + return true +} From 0a4eeaf605efd155cd5b8779ebb8952955b90ee5 Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 13 Jun 2024 00:47:49 +0900 Subject: [PATCH 113/396] refactor Palindrome Number --- go/palindrome_number.go | 24 +++--------------------- 1 file changed, 3 insertions(+), 21 deletions(-) diff --git a/go/palindrome_number.go b/go/palindrome_number.go index 9d0deb3..a9285c8 100644 --- a/go/palindrome_number.go +++ b/go/palindrome_number.go @@ -2,32 +2,14 @@ package main func isPalindromeNumber(x int) bool { - // TestCase: -1, 0, 1, 12, 121, 1231 - if x < 0 { return false } - if x <= 9 { - return true - } - var nums []int + original, reversed := x, 0 for x > 0 { - nums = append(nums, x%10) + reversed = reversed*10 + x%10 x /= 10 } - - for i, n := range nums { - j := len(nums) - 1 - i - - if i >= j { - break - } - - if n != nums[j] { - return false - } - } - - return true + return original == reversed } From 8d925fd10e6cbc4d5e363fa70c8ba84fb7992597 Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 13 Jun 2024 01:30:23 +0900 Subject: [PATCH 114/396] create Convert Sorted Array to Binary Search Tree --- ...vert_sorted_array_to_binary_search_tree.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 go/convert_sorted_array_to_binary_search_tree.go diff --git a/go/convert_sorted_array_to_binary_search_tree.go b/go/convert_sorted_array_to_binary_search_tree.go new file mode 100644 index 0000000..ba12eb4 --- /dev/null +++ b/go/convert_sorted_array_to_binary_search_tree.go @@ -0,0 +1,19 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +func sortedArrayToBST(nums []int) *TreeNode { + return buildBST(nums, 0, len(nums)-1) +} + +func buildBST(nums []int, left int, right int) *TreeNode { + if left > right { + return nil + } + + mid := left + (right-left)/2 + node := &TreeNode{Val: nums[mid]} + node.Left = buildBST(nums, left, mid-1) + node.Right = buildBST(nums, mid+1, right) + + return node +} From baaf81b004a0f891ff08e1b1faeec3042ca8a930 Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 13 Jun 2024 01:41:52 +0900 Subject: [PATCH 115/396] refactor Convert Sorted Array to Binary Search Tree --- ...nvert_sorted_array_to_binary_search_tree.go | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/go/convert_sorted_array_to_binary_search_tree.go b/go/convert_sorted_array_to_binary_search_tree.go index ba12eb4..28ea874 100644 --- a/go/convert_sorted_array_to_binary_search_tree.go +++ b/go/convert_sorted_array_to_binary_search_tree.go @@ -2,18 +2,14 @@ package main func sortedArrayToBST(nums []int) *TreeNode { - return buildBST(nums, 0, len(nums)-1) -} - -func buildBST(nums []int, left int, right int) *TreeNode { - if left > right { + if len(nums) == 0 { return nil } - mid := left + (right-left)/2 - node := &TreeNode{Val: nums[mid]} - node.Left = buildBST(nums, left, mid-1) - node.Right = buildBST(nums, mid+1, right) - - return node + mid := len(nums) / 2 + return &TreeNode{ + Val: nums[mid], + Left: sortedArrayToBST(nums[:mid]), + Right: sortedArrayToBST(nums[mid+1:]), + } } From c3e16cddd1d751464db7771548ff5790af2436f0 Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 13 Jun 2024 13:50:14 +0900 Subject: [PATCH 116/396] refactor move zeroes --- go/move_zeroes.go | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/go/move_zeroes.go b/go/move_zeroes.go index b9745ae..9c3c740 100644 --- a/go/move_zeroes.go +++ b/go/move_zeroes.go @@ -2,13 +2,10 @@ package main func moveZeroes(nums []int) { - zeroIdx := 0 - for i, n := range nums { - if n != 0 { - if i != zeroIdx { - nums[i], nums[zeroIdx] = nums[zeroIdx], nums[i] - } - zeroIdx++ + for l, r := 0, 0; r < len(nums); r++ { + if nums[r] != 0 { + nums[l], nums[r] = nums[r], nums[l] + l++ } } } From 6c19d6f64bb93411e24cdaa246ae31a23e1a161c Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 13 Jun 2024 13:57:53 +0900 Subject: [PATCH 117/396] refactor Move Zeroes --- go/move_zeroes.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/go/move_zeroes.go b/go/move_zeroes.go index 9c3c740..e4089a3 100644 --- a/go/move_zeroes.go +++ b/go/move_zeroes.go @@ -2,10 +2,10 @@ package main func moveZeroes(nums []int) { - for l, r := 0, 0; r < len(nums); r++ { - if nums[r] != 0 { - nums[l], nums[r] = nums[r], nums[l] - l++ + for nonZero, cur := 0, 0; cur < len(nums); cur++ { + if nums[cur] != 0 { + nums[nonZero], nums[cur] = nums[cur], nums[nonZero] + nonZero++ } } } From b1c7429e64c0e069076ab58981be3edad383a5a3 Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 13 Jun 2024 15:06:22 +0900 Subject: [PATCH 118/396] create Reverse Bits --- go/reverse_bits.go | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 go/reverse_bits.go diff --git a/go/reverse_bits.go b/go/reverse_bits.go new file mode 100644 index 0000000..33d1518 --- /dev/null +++ b/go/reverse_bits.go @@ -0,0 +1,20 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +func reverseBits(nums uint32) uint32 { + var reversed uint32 + for i := 0; i < 32; i++ { + reversed = reversed<<1 + nums%2 + nums >>= 1 + } + return reversed +} + +func reverseBits2(num uint32) uint32 { + var res uint32 = 0 + for i := 0; i < 32; i++ { + bit := (num >> i) & 1 + res = res | (bit << (31 - i)) + } + return res +} From a0dfe54bf8f691c62f4ead108970d14a573b1e96 Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 13 Jun 2024 15:22:40 +0900 Subject: [PATCH 119/396] refactor Reverse Bits --- go/reverse_bits.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/go/reverse_bits.go b/go/reverse_bits.go index 33d1518..06be49e 100644 --- a/go/reverse_bits.go +++ b/go/reverse_bits.go @@ -11,10 +11,10 @@ func reverseBits(nums uint32) uint32 { } func reverseBits2(num uint32) uint32 { - var res uint32 = 0 + var reversed uint32 = 0 for i := 0; i < 32; i++ { bit := (num >> i) & 1 - res = res | (bit << (31 - i)) + reversed = reversed | (bit << (31 - i)) } - return res + return reversed } From 1cc3080da72d933e68b805dd82f1a4ad3ae8ecd2 Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 13 Jun 2024 16:28:00 +0900 Subject: [PATCH 120/396] create Subtree of Another Tree --- go/subtree_of_another_tree.go | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 go/subtree_of_another_tree.go diff --git a/go/subtree_of_another_tree.go b/go/subtree_of_another_tree.go new file mode 100644 index 0000000..549cc59 --- /dev/null +++ b/go/subtree_of_another_tree.go @@ -0,0 +1,33 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +func isSubtree(root *TreeNode, subRoot *TreeNode) bool { + // TestCase: [[], []], [[1], []], [[], [1]], [[1], [1]], [[1], [1, 2]], + // [[1, 2, 2, nil, nil, 3], [2, 3]] + if root == nil { + return subRoot == nil + } + + if root.Val == subRoot.Val && + isPartOfSubtree(root.Left, subRoot.Left) && + isPartOfSubtree(root.Right, subRoot.Right) { + return true + } + return isSubtree(root.Left, subRoot) || + isSubtree(root.Right, subRoot) +} + +func isPartOfSubtree(root *TreeNode, subRoot *TreeNode) bool { + if root == nil && subRoot == nil { + return true + } + if root == nil || subRoot == nil { + return false + } + + if root.Val != subRoot.Val { + return false + } + return isPartOfSubtree(root.Left, subRoot.Left) && + isPartOfSubtree(root.Right, subRoot.Right) +} From d5519c46b9515e6672b22f9fb4c89d0baaeca2f4 Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 13 Jun 2024 16:36:56 +0900 Subject: [PATCH 121/396] refactor Subtree of Another Tree --- go/subtree_of_another_tree.go | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/go/subtree_of_another_tree.go b/go/subtree_of_another_tree.go index 549cc59..e01f874 100644 --- a/go/subtree_of_another_tree.go +++ b/go/subtree_of_another_tree.go @@ -8,12 +8,8 @@ func isSubtree(root *TreeNode, subRoot *TreeNode) bool { return subRoot == nil } - if root.Val == subRoot.Val && - isPartOfSubtree(root.Left, subRoot.Left) && - isPartOfSubtree(root.Right, subRoot.Right) { - return true - } - return isSubtree(root.Left, subRoot) || + return isPartOfSubtree(root, subRoot) || + isSubtree(root.Left, subRoot) || isSubtree(root.Right, subRoot) } @@ -21,11 +17,7 @@ func isPartOfSubtree(root *TreeNode, subRoot *TreeNode) bool { if root == nil && subRoot == nil { return true } - if root == nil || subRoot == nil { - return false - } - - if root.Val != subRoot.Val { + if root == nil || subRoot == nil || root.Val != subRoot.Val { return false } return isPartOfSubtree(root.Left, subRoot.Left) && From 00a42dd69b5650104c00711e9b933b803dbf7de6 Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 13 Jun 2024 16:41:48 +0900 Subject: [PATCH 122/396] refactor Subtree of Another Tree --- go/subtree_of_another_tree.go | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/go/subtree_of_another_tree.go b/go/subtree_of_another_tree.go index e01f874..ff62c1d 100644 --- a/go/subtree_of_another_tree.go +++ b/go/subtree_of_another_tree.go @@ -8,18 +8,17 @@ func isSubtree(root *TreeNode, subRoot *TreeNode) bool { return subRoot == nil } - return isPartOfSubtree(root, subRoot) || - isSubtree(root.Left, subRoot) || - isSubtree(root.Right, subRoot) + return areEqualTrees(root, subRoot) || + isSubtree(root.Left, subRoot) || isSubtree(root.Right, subRoot) } -func isPartOfSubtree(root *TreeNode, subRoot *TreeNode) bool { - if root == nil && subRoot == nil { +func areEqualTrees(t1 *TreeNode, t2 *TreeNode) bool { + if t1 == nil && t2 == nil { return true } - if root == nil || subRoot == nil || root.Val != subRoot.Val { + if t1 == nil || t2 == nil || t1.Val != t2.Val { return false } - return isPartOfSubtree(root.Left, subRoot.Left) && - isPartOfSubtree(root.Right, subRoot.Right) + return areEqualTrees(t1.Left, t2.Left) && + areEqualTrees(t1.Right, t2.Right) } From e09e8d611de8af974ca5c64d50dbd6e27d02cff7 Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 13 Jun 2024 17:40:16 +0900 Subject: [PATCH 123/396] create Squares of a Sorted Array --- go/squares_of_a_sorted_array.go | 35 +++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 go/squares_of_a_sorted_array.go diff --git a/go/squares_of_a_sorted_array.go b/go/squares_of_a_sorted_array.go new file mode 100644 index 0000000..9f9acb0 --- /dev/null +++ b/go/squares_of_a_sorted_array.go @@ -0,0 +1,35 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +func sortedSquares(nums []int) []int { + // [-4,-1,0,3,10] + startIdx := 0 + for ; startIdx < len(nums); startIdx++ { + if nums[startIdx] >= 0 { + break + } + } + + var sorted []int + for l, r := startIdx-1, startIdx; 0 <= l || r < len(nums); { + if l < 0 { + sorted = append(sorted, nums[r]*nums[r]) + r++ + continue + } + if len(nums) <= r { + sorted = append(sorted, nums[l]*nums[l]) + l-- + continue + } + + if nums[l]*nums[l] <= nums[r]*nums[r] { + sorted = append(sorted, nums[l]*nums[l]) + l-- + } else { + sorted = append(sorted, nums[r]*nums[r]) + r++ + } + } + return sorted +} From a5073d2c43a62a8aaf08a8762ad04575dc9107ef Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 13 Jun 2024 18:00:00 +0900 Subject: [PATCH 124/396] refactor Squares of a Sorted Array --- go/squares_of_a_sorted_array.go | 39 ++++++++++----------------------- 1 file changed, 12 insertions(+), 27 deletions(-) diff --git a/go/squares_of_a_sorted_array.go b/go/squares_of_a_sorted_array.go index 9f9acb0..f1f02aa 100644 --- a/go/squares_of_a_sorted_array.go +++ b/go/squares_of_a_sorted_array.go @@ -1,35 +1,20 @@ //lint:file-ignore U1000 Ignore all unused code package main -func sortedSquares(nums []int) []int { - // [-4,-1,0,3,10] - startIdx := 0 - for ; startIdx < len(nums); startIdx++ { - if nums[startIdx] >= 0 { - break - } - } +import "math" - var sorted []int - for l, r := startIdx-1, startIdx; 0 <= l || r < len(nums); { - if l < 0 { - sorted = append(sorted, nums[r]*nums[r]) - r++ - continue - } - if len(nums) <= r { - sorted = append(sorted, nums[l]*nums[l]) - l-- - continue - } - - if nums[l]*nums[l] <= nums[r]*nums[r] { - sorted = append(sorted, nums[l]*nums[l]) - l-- +func sortedSquares(nums []int) []int { + sq := make([]int, len(nums)) + i := len(nums) - 1 + for l, r := 0, len(nums)-1; l <= r; { + if math.Abs(float64(nums[l])) > math.Abs(float64(nums[r])) { + sq[i] = nums[l] * nums[l] + l++ } else { - sorted = append(sorted, nums[r]*nums[r]) - r++ + sq[i] = nums[r] * nums[r] + r-- } + i-- } - return sorted + return sq } From f24b8ccfbdacbea05eae0c5a748e6c80bbd84baa Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 13 Jun 2024 20:33:27 +0900 Subject: [PATCH 125/396] refactor Linked List Cycle --- go/linked_list_cycle.go | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/go/linked_list_cycle.go b/go/linked_list_cycle.go index 331d6c1..0408ae6 100644 --- a/go/linked_list_cycle.go +++ b/go/linked_list_cycle.go @@ -2,18 +2,12 @@ package main func hasCycle(head *ListNode) bool { - if head == nil || head.Next == nil { - return false - } - - turtle, rabbit := head.Next, head.Next.Next - for turtle != rabbit { - if rabbit == nil || rabbit.Next == nil { - return false + fast, slow := head, head + for fast != nil && fast.Next != nil { + fast, slow = fast.Next.Next, slow.Next + if fast == slow { + return true } - - turtle = turtle.Next - rabbit = rabbit.Next.Next } - return true + return false } From e1a912c56811179b805ae61ed39a569552ff2050 Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 13 Jun 2024 21:05:35 +0900 Subject: [PATCH 126/396] refactor Implement Queue using Stacks --- ...ks1.go => implement_queue_using_stacks.go} | 12 ++------ go/implement_queue_using_stacks2.go | 28 ------------------- 2 files changed, 3 insertions(+), 37 deletions(-) rename go/{implement_queue_using_stacks1.go => implement_queue_using_stacks.go} (80%) delete mode 100644 go/implement_queue_using_stacks2.go diff --git a/go/implement_queue_using_stacks1.go b/go/implement_queue_using_stacks.go similarity index 80% rename from go/implement_queue_using_stacks1.go rename to go/implement_queue_using_stacks.go index 0be760b..fa7be02 100644 --- a/go/implement_queue_using_stacks1.go +++ b/go/implement_queue_using_stacks.go @@ -15,24 +15,18 @@ func (q *MyQueue) Push(x int) { } func (q *MyQueue) Pop() int { - tail := q.Peek() + x := q.Peek() q.OutputStack = q.OutputStack[:len(q.OutputStack)-1] - return tail + return x } func (q *MyQueue) Peek() int { - if q.Empty() { - return -1 - } - if len(q.OutputStack) == 0 { for len(q.InputStack) > 0 { - tail := q.InputStack[len(q.InputStack)-1] + q.OutputStack = append(q.OutputStack, q.InputStack[len(q.InputStack)-1]) q.InputStack = q.InputStack[:len(q.InputStack)-1] - q.OutputStack = append(q.OutputStack, tail) } } - return q.OutputStack[len(q.OutputStack)-1] } diff --git a/go/implement_queue_using_stacks2.go b/go/implement_queue_using_stacks2.go deleted file mode 100644 index cad5534..0000000 --- a/go/implement_queue_using_stacks2.go +++ /dev/null @@ -1,28 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package main - -type MyQueue2 struct { - Queue []int -} - -func Constructor2() MyQueue2 { - return MyQueue2{} -} - -func (q *MyQueue2) Push(x int) { - q.Queue = append(q.Queue, x) -} - -func (q *MyQueue2) Pop() int { - x := q.Queue[0] - q.Queue = q.Queue[1:] - return x -} - -func (q *MyQueue2) Peek() int { - return q.Queue[0] -} - -func (q *MyQueue2) Empty() bool { - return len(q.Queue) == 0 -} From 2b56bff878d51af91f446d2aa5acce26103778a5 Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 13 Jun 2024 22:29:30 +0900 Subject: [PATCH 127/396] refactor Ransom Note --- go/ransom_note.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/go/ransom_note.go b/go/ransom_note.go index fabb8fd..196f2f7 100644 --- a/go/ransom_note.go +++ b/go/ransom_note.go @@ -2,17 +2,17 @@ package main func canConstruct(ransomNote string, magazine string) bool { - var l [26]int + var freq [26]int for _, r := range magazine { - l[r-'a']++ + freq[r-'a']++ } for _, r := range ransomNote { - if l[r-'a'] <= 0 { + freq[r-'a']-- + if freq[r-'a'] < 0 { return false } - l[r-'a']-- } return true } From 2cf775a6795acecf87c004bf77aedeadf761b11e Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 13 Jun 2024 22:42:44 +0900 Subject: [PATCH 128/396] refactor Climbing Stairs --- go/climbing_stairs.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/go/climbing_stairs.go b/go/climbing_stairs.go index 9973bda..8e04f44 100644 --- a/go/climbing_stairs.go +++ b/go/climbing_stairs.go @@ -2,8 +2,8 @@ package main func climbStairs(n int) int { - prev, curr := 1, 1 - for i := 1; i < n; i++ { + prev, curr := 0, 1 + for i := 0; i < n; i++ { prev, curr = curr, prev+curr } return curr From c3b7d26d1bc34707e39f371b0247ec62654afcd2 Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 13 Jun 2024 23:12:51 +0900 Subject: [PATCH 129/396] refactor Reverse Linked List --- go/reverse_linked_list.go | 26 ++++++++++++++++++++++++++ go/reverse_linked_list1.go | 17 ----------------- go/reverse_linked_list2.go | 14 -------------- 3 files changed, 26 insertions(+), 31 deletions(-) create mode 100644 go/reverse_linked_list.go delete mode 100644 go/reverse_linked_list1.go delete mode 100644 go/reverse_linked_list2.go diff --git a/go/reverse_linked_list.go b/go/reverse_linked_list.go new file mode 100644 index 0000000..d31ca47 --- /dev/null +++ b/go/reverse_linked_list.go @@ -0,0 +1,26 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +func reverseList_iterative(head *ListNode) *ListNode { + var prev *ListNode + + for head != nil { + next := head.Next + head.Next = prev + prev, head = head, next + } + + return prev +} + +func reverseList_recursive(head *ListNode) *ListNode { + // Test Case: [], [1], [1, 2], [1, 2, 3], [1, 2, 3, 4] + if head == nil || head.Next == nil { + return head + } + + next := head.Next + reversedListHead := reverseList_recursive(next) + next.Next, head.Next = head, nil + return reversedListHead +} diff --git a/go/reverse_linked_list1.go b/go/reverse_linked_list1.go deleted file mode 100644 index 760de39..0000000 --- a/go/reverse_linked_list1.go +++ /dev/null @@ -1,17 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package main - -func reverseList1(head *ListNode) *ListNode { - // Test Case: [], [1], [1, 2], [1, 2, 3], [1, 2, 3, 4] - var prev *ListNode - curr := head - - for curr != nil { - next := curr.Next - curr.Next = prev - prev = curr - curr = next - } - - return prev -} diff --git a/go/reverse_linked_list2.go b/go/reverse_linked_list2.go deleted file mode 100644 index 899d1c4..0000000 --- a/go/reverse_linked_list2.go +++ /dev/null @@ -1,14 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package main - -func reverseList2(head *ListNode) *ListNode { - // Test Case: [], [1], [1, 2], [1, 2, 3], [1, 2, 3, 4] - if head == nil || head.Next == nil { - return head - } - - next := head.Next - reversedListHead := reverseList2(next) - next.Next, head.Next = head, nil - return reversedListHead -} From 8f6800b4151fc0e3c3ad1d925d7bc8220bc9d4f7 Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 13 Jun 2024 23:35:48 +0900 Subject: [PATCH 130/396] refactor Majority Element --- go/majority_element.go | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/go/majority_element.go b/go/majority_element.go index 259ee2d..aaa3134 100644 --- a/go/majority_element.go +++ b/go/majority_element.go @@ -2,16 +2,15 @@ package main func majorityElement(nums []int) int { - candidate := nums[0] - cnt := 1 - for i := 1; i < len(nums); i++ { - if nums[i] == candidate { + candidate, cnt := nums[0], 0 + for _, n := range nums { + if n == candidate { cnt++ } else { cnt-- if cnt == 0 { - candidate = nums[i] - cnt = 1 + candidate = n + cnt++ } } } From 98c2511a3de49622c2ac8318176b37a0f5852cf0 Mon Sep 17 00:00:00 2001 From: rihib Date: Fri, 14 Jun 2024 01:36:17 +0900 Subject: [PATCH 131/396] refactor Balanced Binary Tree --- go/balanced_binary_tree.go | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/go/balanced_binary_tree.go b/go/balanced_binary_tree.go index abd4ad6..9db7e90 100644 --- a/go/balanced_binary_tree.go +++ b/go/balanced_binary_tree.go @@ -9,18 +9,17 @@ type TreeBalance struct { } func isBalanced(root *TreeNode) bool { - return traversal(root).IsBalanced + return checkBalance(root).IsBalanced } -func traversal(root *TreeNode) TreeBalance { +func checkBalance(root *TreeNode) TreeBalance { if root == nil { return TreeBalance{true, 0} } - l, r := traversal(root.Left), traversal(root.Right) - b := l.IsBalanced && - r.IsBalanced && - (int(math.Abs(float64(l.Height)-float64(r.Height))) <= 1) + l, r := checkBalance(root.Left), checkBalance(root.Right) + b := l.IsBalanced && r.IsBalanced && + math.Abs(float64(l.Height-r.Height)) <= 1 h := max(l.Height, r.Height) + 1 return TreeBalance{b, h} } From a9fd2c3d8f9b7ad74398c3414b94d37316c5d49e Mon Sep 17 00:00:00 2001 From: rihib Date: Fri, 14 Jun 2024 21:10:16 +0900 Subject: [PATCH 132/396] refactor Merge Two Sorted Lists --- go/merge_two_sorted_lists.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/go/merge_two_sorted_lists.go b/go/merge_two_sorted_lists.go index 34798ff..7d20a15 100644 --- a/go/merge_two_sorted_lists.go +++ b/go/merge_two_sorted_lists.go @@ -7,11 +7,9 @@ func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode { for list1 != nil && list2 != nil { if list1.Val < list2.Val { - cur.Next = list1 - list1 = list1.Next + cur.Next, list1 = list1, list1.Next } else { - cur.Next = list2 - list2 = list2.Next + cur.Next, list2 = list2, list2.Next } cur = cur.Next } From f0e27d917cdb46a272f9a3b447a62334c908662b Mon Sep 17 00:00:00 2001 From: rihib Date: Fri, 14 Jun 2024 21:39:44 +0900 Subject: [PATCH 133/396] add another solution for Merge Two Sorted Lists --- go/merge_two_sorted_lists.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/go/merge_two_sorted_lists.go b/go/merge_two_sorted_lists.go index 7d20a15..d783b09 100644 --- a/go/merge_two_sorted_lists.go +++ b/go/merge_two_sorted_lists.go @@ -23,3 +23,29 @@ func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode { return dummy.Next } + +func mergeTwoLists2(list1 *ListNode, list2 *ListNode) *ListNode { + sorted := new(ListNode) + tail := sorted + + for list1 != nil || list2 != nil { + if list1 == nil { + tail.Next = list2 + break + } + if list2 == nil { + tail.Next = list1 + break + } + + if list1.Val < list2.Val { + tail.Next, list1 = list1, list1.Next + } else { + tail.Next, list2 = list2, list2.Next + } + tail = tail.Next + tail.Next = nil + } + + return sorted.Next +} From 076cab33db7cc6ec422c7af71b60b6680fde116b Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 16 Jun 2024 14:46:54 +0900 Subject: [PATCH 134/396] refactor Best Time to Buy and Sell Stock --- go/best_time_to_buy_and_sell_stock.go | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/go/best_time_to_buy_and_sell_stock.go b/go/best_time_to_buy_and_sell_stock.go index cf15041..17a0640 100644 --- a/go/best_time_to_buy_and_sell_stock.go +++ b/go/best_time_to_buy_and_sell_stock.go @@ -2,11 +2,10 @@ package main func maxProfit(prices []int) int { - res := 0 - minProfit := prices[0] - for i := 0; i < len(prices); i++ { - res = max(res, prices[i]-minProfit) - minProfit = min(minProfit, prices[i]) + minPrice, maxProfit := prices[0], 0 + for _, n := range prices { + minPrice = min(minPrice, n) + maxProfit = max(maxProfit, n-minPrice) } - return res + return maxProfit } From 56da433bd23066e96f4fb2fa2f4bfd1625e2007c Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 16 Jun 2024 14:52:13 +0900 Subject: [PATCH 135/396] refactor Best Time to Buy and Sell Stock --- go/best_time_to_buy_and_sell_stock.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/go/best_time_to_buy_and_sell_stock.go b/go/best_time_to_buy_and_sell_stock.go index 17a0640..6e8ecf8 100644 --- a/go/best_time_to_buy_and_sell_stock.go +++ b/go/best_time_to_buy_and_sell_stock.go @@ -2,10 +2,10 @@ package main func maxProfit(prices []int) int { - minPrice, maxProfit := prices[0], 0 + lowestPrice, highestProfit := prices[0], 0 for _, n := range prices { - minPrice = min(minPrice, n) - maxProfit = max(maxProfit, n-minPrice) + lowestPrice = min(lowestPrice, n) + highestProfit = max(highestProfit, n-lowestPrice) } - return maxProfit + return highestProfit } From 8d3b3359bd90d43cf4747c3ac36e2d426b15b17c Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 16 Jun 2024 15:47:27 +0900 Subject: [PATCH 136/396] refactor Valid Palindrome --- go/valid_palindrome.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/go/valid_palindrome.go b/go/valid_palindrome.go index 2334588..1d3dbdb 100644 --- a/go/valid_palindrome.go +++ b/go/valid_palindrome.go @@ -5,8 +5,7 @@ import "unicode" func isPalindrome(s string) bool { r := []rune(s) - i, j := 0, len(r)-1 - for i < j { + for i, j := 0, len(r)-1; i < j; { if !(unicode.IsLetter(r[i]) || unicode.IsDigit(r[i])) { i++ continue From 32cd55fd62b241c3fb0c1ef3f26954e681d15cf7 Mon Sep 17 00:00:00 2001 From: rihib Date: Wed, 19 Jun 2024 16:30:10 +0900 Subject: [PATCH 137/396] refactor Invert Binary Tree --- go/invert_binary_tree.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/go/invert_binary_tree.go b/go/invert_binary_tree.go index 4a1f40f..b63eb53 100644 --- a/go/invert_binary_tree.go +++ b/go/invert_binary_tree.go @@ -3,8 +3,7 @@ package main func invertTree(root *TreeNode) *TreeNode { if root != nil { - tmp := root.Left - root.Left, root.Right = invertTree(root.Right), invertTree(tmp) + root.Left, root.Right = invertTree(root.Right), invertTree(root.Left) } return root } From 2084b03c8b3e8f822f7dce752069a490fdef2a96 Mon Sep 17 00:00:00 2001 From: rihib Date: Wed, 19 Jun 2024 16:57:38 +0900 Subject: [PATCH 138/396] refactor Binary Search --- go/binary_search.go | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/go/binary_search.go b/go/binary_search.go index 89da515..a60ad7d 100644 --- a/go/binary_search.go +++ b/go/binary_search.go @@ -2,16 +2,20 @@ package main func search(nums []int, target int) int { - left, right := 0, len(nums)-1 - for left <= right { - mid := (left + right) / 2 + l, r := 0, len(nums)-1 + for l <= r { + mid := (l + r) / 2 + + if target == nums[mid] { + return mid + } + if target < nums[mid] { - right = mid - 1 - } else if nums[mid] < target { - left = mid + 1 + r = mid - 1 } else { - return mid + l = mid + 1 } } + return -1 } From 2c7b94cb56d358d6e7d0aaa670127240c283520a Mon Sep 17 00:00:00 2001 From: rihib Date: Fri, 21 Jun 2024 00:03:05 +0900 Subject: [PATCH 139/396] refactor Merge Two Sorted Lists --- go/merge_two_sorted_lists.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/go/merge_two_sorted_lists.go b/go/merge_two_sorted_lists.go index d783b09..ce50992 100644 --- a/go/merge_two_sorted_lists.go +++ b/go/merge_two_sorted_lists.go @@ -25,8 +25,8 @@ func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode { } func mergeTwoLists2(list1 *ListNode, list2 *ListNode) *ListNode { - sorted := new(ListNode) - tail := sorted + dummy := new(ListNode) + tail := dummy for list1 != nil || list2 != nil { if list1 == nil { @@ -47,5 +47,5 @@ func mergeTwoLists2(list1 *ListNode, list2 *ListNode) *ListNode { tail.Next = nil } - return sorted.Next + return dummy.Next } From 81bc9d12b26292e1c5522e101fcd7233a0e39836 Mon Sep 17 00:00:00 2001 From: rihib Date: Fri, 21 Jun 2024 01:12:26 +0900 Subject: [PATCH 140/396] refactor Balanced Binary Tree --- go/balanced_binary_tree.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/balanced_binary_tree.go b/go/balanced_binary_tree.go index 9db7e90..f82ca12 100644 --- a/go/balanced_binary_tree.go +++ b/go/balanced_binary_tree.go @@ -19,7 +19,7 @@ func checkBalance(root *TreeNode) TreeBalance { l, r := checkBalance(root.Left), checkBalance(root.Right) b := l.IsBalanced && r.IsBalanced && - math.Abs(float64(l.Height-r.Height)) <= 1 + math.Abs(float64(l.Height-r.Height)) <= 1.0 h := max(l.Height, r.Height) + 1 return TreeBalance{b, h} } From d374abaf63542bd1558b343581905850cbeb8d57 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 22 Jun 2024 12:43:13 +0900 Subject: [PATCH 141/396] create dir for review --- pullrequests/template/step1.go | 1 + pullrequests/template/step2.go | 1 + pullrequests/template/step3.go | 1 + 3 files changed, 3 insertions(+) create mode 100644 pullrequests/template/step1.go create mode 100644 pullrequests/template/step2.go create mode 100644 pullrequests/template/step3.go diff --git a/pullrequests/template/step1.go b/pullrequests/template/step1.go new file mode 100644 index 0000000..38cdfe4 --- /dev/null +++ b/pullrequests/template/step1.go @@ -0,0 +1 @@ +package template diff --git a/pullrequests/template/step2.go b/pullrequests/template/step2.go new file mode 100644 index 0000000..38cdfe4 --- /dev/null +++ b/pullrequests/template/step2.go @@ -0,0 +1 @@ +package template diff --git a/pullrequests/template/step3.go b/pullrequests/template/step3.go new file mode 100644 index 0000000..38cdfe4 --- /dev/null +++ b/pullrequests/template/step3.go @@ -0,0 +1 @@ +package template From 1caa6637f8b4be9c3ebd7b40976439de1457fb58 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 22 Jun 2024 12:52:31 +0900 Subject: [PATCH 142/396] update README --- pullrequests/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 pullrequests/README.md diff --git a/pullrequests/README.md b/pullrequests/README.md new file mode 100644 index 0000000..c38c369 --- /dev/null +++ b/pullrequests/README.md @@ -0,0 +1,3 @@ +# Getting Started + +もらったWebhookをGitHubに登録する。注意点として、もらったWebhook URLの末尾に`/github`を追加する必要がある([参照](https://gist.github.com/jagrosh/5b1761213e33fc5b54ec7f6379034a22)) From f5b39905e5f99744c896d8dea99c4e424704c915 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 22 Jun 2024 12:56:54 +0900 Subject: [PATCH 143/396] update README.md --- pullrequests/README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/pullrequests/README.md b/pullrequests/README.md index c38c369..acc72f8 100644 --- a/pullrequests/README.md +++ b/pullrequests/README.md @@ -1,3 +1,12 @@ # Getting Started もらったWebhookをGitHubに登録する。注意点として、もらったWebhook URLの末尾に`/github`を追加する必要がある([参照](https://gist.github.com/jagrosh/5b1761213e33fc5b54ec7f6379034a22)) + +レビュー依頼文テンプレート: + +```plaintext +XXXを解きました。レビューお願いいたします🙏 +言語: Go +問題: https://leetcode.com/problems/XXX/description/ +PR: https://github.com/rihib/leetcode/pull/XXX +``` From 00a8c93dd8b3a55704b465ad3798f7a408fa7e57 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 22 Jun 2024 13:00:44 +0900 Subject: [PATCH 144/396] refactor: Ignore all unused code in template files --- pullrequests/template/step1.go | 1 + pullrequests/template/step2.go | 1 + pullrequests/template/step3.go | 1 + 3 files changed, 3 insertions(+) diff --git a/pullrequests/template/step1.go b/pullrequests/template/step1.go index 38cdfe4..0cfddfb 100644 --- a/pullrequests/template/step1.go +++ b/pullrequests/template/step1.go @@ -1 +1,2 @@ +//lint:file-ignore U1000 Ignore all unused code package template diff --git a/pullrequests/template/step2.go b/pullrequests/template/step2.go index 38cdfe4..0cfddfb 100644 --- a/pullrequests/template/step2.go +++ b/pullrequests/template/step2.go @@ -1 +1,2 @@ +//lint:file-ignore U1000 Ignore all unused code package template diff --git a/pullrequests/template/step3.go b/pullrequests/template/step3.go index 38cdfe4..0cfddfb 100644 --- a/pullrequests/template/step3.go +++ b/pullrequests/template/step3.go @@ -1 +1,2 @@ +//lint:file-ignore U1000 Ignore all unused code package template From 6b8c2bb31570f7baec038c6d7af113c7ff6e0781 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 22 Jun 2024 13:15:37 +0900 Subject: [PATCH 145/396] refactor: add comment lines --- pullrequests/template/step1.go | 4 ++++ pullrequests/template/step2.go | 4 ++++ pullrequests/template/step3.go | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/pullrequests/template/step1.go b/pullrequests/template/step1.go index 0cfddfb..b0c1012 100644 --- a/pullrequests/template/step1.go +++ b/pullrequests/template/step1.go @@ -1,2 +1,6 @@ //lint:file-ignore U1000 Ignore all unused code package template + +/* +COMMENT +*/ diff --git a/pullrequests/template/step2.go b/pullrequests/template/step2.go index 0cfddfb..b0c1012 100644 --- a/pullrequests/template/step2.go +++ b/pullrequests/template/step2.go @@ -1,2 +1,6 @@ //lint:file-ignore U1000 Ignore all unused code package template + +/* +COMMENT +*/ diff --git a/pullrequests/template/step3.go b/pullrequests/template/step3.go index 0cfddfb..b0c1012 100644 --- a/pullrequests/template/step3.go +++ b/pullrequests/template/step3.go @@ -1,2 +1,6 @@ //lint:file-ignore U1000 Ignore all unused code package template + +/* +COMMENT +*/ From 40e03352b6c83aa3890e251d9a4d1c6d55734e46 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 22 Jun 2024 13:22:58 +0900 Subject: [PATCH 146/396] refactor Merge Two Sorted Lists --- go/merge_two_sorted_lists.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/go/merge_two_sorted_lists.go b/go/merge_two_sorted_lists.go index ce50992..c4f3833 100644 --- a/go/merge_two_sorted_lists.go +++ b/go/merge_two_sorted_lists.go @@ -3,22 +3,22 @@ package main func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode { dummy := new(ListNode) - cur := dummy + tail := dummy for list1 != nil && list2 != nil { if list1.Val < list2.Val { - cur.Next, list1 = list1, list1.Next + tail.Next, list1 = list1, list1.Next } else { - cur.Next, list2 = list2, list2.Next + tail.Next, list2 = list2, list2.Next } - cur = cur.Next + tail = tail.Next } if list1 != nil { - cur.Next = list1 + tail.Next = list1 } if list2 != nil { - cur.Next = list2 + tail.Next = list2 } return dummy.Next From 9aaebe0cfaa1a0d3d67cab1faa2624278f97ab8f Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 22 Jun 2024 13:56:57 +0900 Subject: [PATCH 147/396] for_review: Merge Two Sorted Lists --- pullrequests/merge_two_sorted_lists/step1.go | 60 ++++++++++++++++ pullrequests/merge_two_sorted_lists/step2.go | 30 ++++++++ pullrequests/merge_two_sorted_lists/step3.go | 73 ++++++++++++++++++++ 3 files changed, 163 insertions(+) create mode 100644 pullrequests/merge_two_sorted_lists/step1.go create mode 100644 pullrequests/merge_two_sorted_lists/step2.go create mode 100644 pullrequests/merge_two_sorted_lists/step3.go diff --git a/pullrequests/merge_two_sorted_lists/step1.go b/pullrequests/merge_two_sorted_lists/step1.go new file mode 100644 index 0000000..8dac4a4 --- /dev/null +++ b/pullrequests/merge_two_sorted_lists/step1.go @@ -0,0 +1,60 @@ +//lint:file-ignore U1000 Ignore all unused code +package mergetwosortedlists + +/* + 個人的にLeetCodeを進めていて、2月ごろに解いたもの。GitHubのコミット履歴から引っ張ってきま + した。 + + 解いた時間を記録していなかったのですが、恐らく20~30分ぐらいかかった気がします。解いている途 + 中でポインタの向きがよくわからなくなってしまい、時間がかかってしまった記憶があります。また、 + Goの勉強も兼ねて書いたので、言語自体の知識も少ない状態で書きました。 + + 綺麗に書いている余裕がなかったので、とりあえず動くコードを書いたという感じです。とりあえず値 + の小さいノードから順番にポインタの向きを変えてマージしていけば良いとはわかったのですが、実装 + 力に余裕がなく、コードが冗長になってしまったという印象です。 +*/ + +type ListNode struct { + Val int + Next *ListNode +} + +func mergeTwoLists_step1(list1 *ListNode, list2 *ListNode) *ListNode { + if list1 == nil { + return list2 + } + if list2 == nil { + return list1 + } + + var res *ListNode + if list1.Val <= list2.Val { + res = list1 + list1 = list1.Next + } else { + res = list2 + list2 = list2.Next + } + + curNode := res + for { + if list1 == nil { + curNode.Next = list2 + return res + } + if list2 == nil { + curNode.Next = list1 + return res + } + + if list1.Val <= list2.Val { + curNode.Next = list1 + curNode = curNode.Next + list1 = list1.Next + } else { + curNode.Next = list2 + curNode = curNode.Next + list2 = list2.Next + } + } +} diff --git a/pullrequests/merge_two_sorted_lists/step2.go b/pullrequests/merge_two_sorted_lists/step2.go new file mode 100644 index 0000000..ea5a58c --- /dev/null +++ b/pullrequests/merge_two_sorted_lists/step2.go @@ -0,0 +1,30 @@ +//lint:file-ignore U1000 Ignore all unused code +package mergetwosortedlists + +/* + 他の人のコードを色々見て、冗長な部分を消し、リファクタをしました。 +*/ + +func mergeTwoLists_step2(list1 *ListNode, list2 *ListNode) *ListNode { + dummy := new(ListNode) + cur := dummy + + for list1 != nil && list2 != nil { + if list1.Val <= list2.Val { + cur.Next = list1 + list1 = list1.Next + } else { + cur.Next = list2 + list2 = list2.Next + } + cur = cur.Next + } + + if list1 != nil { + cur.Next = list1 + } else { + cur.Next = list2 + } + + return dummy.Next +} diff --git a/pullrequests/merge_two_sorted_lists/step3.go b/pullrequests/merge_two_sorted_lists/step3.go new file mode 100644 index 0000000..8dfaac0 --- /dev/null +++ b/pullrequests/merge_two_sorted_lists/step3.go @@ -0,0 +1,73 @@ +//lint:file-ignore U1000 Ignore all unused code +package mergetwosortedlists + +/* + 感想: + 現在(6月)解いたコードになります。大分余裕を持って書けるようになってきました。一番初めはポ + インタの向きがよくわからなくなるということがあったのですが、そういったこともなくなり、ポイ + ンタの操作を余裕を持って書けるようになってきました。暗記ではなく、自然と同じようなコードが + 出てくるようになりました。またGo自体も初期に比べて無理なく自然に書けるようになりました。 + + Step2に比べて変数名が改善されています(curではなくtailに変更)。また個人的にシンプルで見 + やすいと思っているので多重代入をよく使うようになりました。 + + また、個人的な感覚として、list1またはlist2のどちらか片方がnilの場合の処理をfor文の中に入 + れるか、外に出すかをその時の気分で意図的に変えるようになりました。 + + 質問したいこと: + - tailという変数名についてどう思いますか? + - 多重代入は使った方がシンプルで見やすいと個人的に思ってるのですがどう思いますか?もちろん + 互いに影響を与え合ってしまうような変数同士の場合は挙動がundefinedだと思うので避けるべき + だとは思いますが。 + - 個人的には上と下の回答はどちらも大差ないと思っていてどちらでも良いと思っているのですが、 + どう思いますか? +*/ + +func mergeTwoLists_step3(list1 *ListNode, list2 *ListNode) *ListNode { + dummy := new(ListNode) + tail := dummy + + for list1 != nil && list2 != nil { + if list1.Val < list2.Val { + tail.Next, list1 = list1, list1.Next + } else { + tail.Next, list2 = list2, list2.Next + } + tail = tail.Next + } + + if list1 != nil { + tail.Next = list1 + } + if list2 != nil { + tail.Next = list2 + } + + return dummy.Next +} + +func mergeTwoLists_step3_anothersolution(list1 *ListNode, list2 *ListNode) *ListNode { + dummy := new(ListNode) + tail := dummy + + for list1 != nil || list2 != nil { + if list1 == nil { + tail.Next = list2 + break + } + if list2 == nil { + tail.Next = list1 + break + } + + if list1.Val < list2.Val { + tail.Next, list1 = list1, list1.Next + } else { + tail.Next, list2 = list2, list2.Next + } + tail = tail.Next + tail.Next = nil + } + + return dummy.Next +} From ddb9464c35fd1248d0bef36ae476d35724b7809f Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 23 Jun 2024 13:41:55 +0900 Subject: [PATCH 148/396] refactor Reverse Linked List --- go/reverse_linked_list.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/go/reverse_linked_list.go b/go/reverse_linked_list.go index d31ca47..0a094c5 100644 --- a/go/reverse_linked_list.go +++ b/go/reverse_linked_list.go @@ -3,13 +3,9 @@ package main func reverseList_iterative(head *ListNode) *ListNode { var prev *ListNode - for head != nil { - next := head.Next - head.Next = prev - prev, head = head, next + prev, head, head.Next = head, head.Next, prev } - return prev } From db36382cae819196e3d5ae07df40160313d00c43 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 23 Jun 2024 14:23:13 +0900 Subject: [PATCH 149/396] refactor Reverse Linked List --- go/reverse_linked_list.go | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/go/reverse_linked_list.go b/go/reverse_linked_list.go index 0a094c5..69e2142 100644 --- a/go/reverse_linked_list.go +++ b/go/reverse_linked_list.go @@ -9,14 +9,13 @@ func reverseList_iterative(head *ListNode) *ListNode { return prev } -func reverseList_recursive(head *ListNode) *ListNode { - // Test Case: [], [1], [1, 2], [1, 2, 3], [1, 2, 3, 4] +func reverseList_recurssive(head *ListNode) *ListNode { if head == nil || head.Next == nil { return head } next := head.Next - reversedListHead := reverseList_recursive(next) - next.Next, head.Next = head, nil - return reversedListHead + reversedHead := reverseList(next) + head.Next, next.Next = nil, head + return reversedHead } From f9a60185da4e869e000d39cd4f2d5b7b71911167 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 23 Jun 2024 14:23:36 +0900 Subject: [PATCH 150/396] fix typo --- go/reverse_linked_list.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/reverse_linked_list.go b/go/reverse_linked_list.go index 69e2142..31850e2 100644 --- a/go/reverse_linked_list.go +++ b/go/reverse_linked_list.go @@ -15,7 +15,7 @@ func reverseList_recurssive(head *ListNode) *ListNode { } next := head.Next - reversedHead := reverseList(next) + reversedHead := reverseList_recurssive(next) head.Next, next.Next = nil, head return reversedHead } From 7c5b757d2d7acbaa6636cfeee63a95bfd4df8561 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 23 Jun 2024 15:00:06 +0900 Subject: [PATCH 151/396] revert changes --- go/reverse_linked_list.go | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/go/reverse_linked_list.go b/go/reverse_linked_list.go index 31850e2..d31ca47 100644 --- a/go/reverse_linked_list.go +++ b/go/reverse_linked_list.go @@ -3,19 +3,24 @@ package main func reverseList_iterative(head *ListNode) *ListNode { var prev *ListNode + for head != nil { - prev, head, head.Next = head, head.Next, prev + next := head.Next + head.Next = prev + prev, head = head, next } + return prev } -func reverseList_recurssive(head *ListNode) *ListNode { +func reverseList_recursive(head *ListNode) *ListNode { + // Test Case: [], [1], [1, 2], [1, 2, 3], [1, 2, 3, 4] if head == nil || head.Next == nil { return head } next := head.Next - reversedHead := reverseList_recurssive(next) - head.Next, next.Next = nil, head - return reversedHead + reversedListHead := reverseList_recursive(next) + next.Next, head.Next = head, nil + return reversedListHead } From be5c7ea1ccae2838fcb902144a0485877fce512e Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 23 Jun 2024 15:01:15 +0900 Subject: [PATCH 152/396] refactor Reverse Linked List --- go/reverse_linked_list.go | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/go/reverse_linked_list.go b/go/reverse_linked_list.go index d31ca47..31850e2 100644 --- a/go/reverse_linked_list.go +++ b/go/reverse_linked_list.go @@ -3,24 +3,19 @@ package main func reverseList_iterative(head *ListNode) *ListNode { var prev *ListNode - for head != nil { - next := head.Next - head.Next = prev - prev, head = head, next + prev, head, head.Next = head, head.Next, prev } - return prev } -func reverseList_recursive(head *ListNode) *ListNode { - // Test Case: [], [1], [1, 2], [1, 2, 3], [1, 2, 3, 4] +func reverseList_recurssive(head *ListNode) *ListNode { if head == nil || head.Next == nil { return head } next := head.Next - reversedListHead := reverseList_recursive(next) - next.Next, head.Next = head, nil - return reversedListHead + reversedHead := reverseList_recurssive(next) + head.Next, next.Next = nil, head + return reversedHead } From 4a78bd8ba2f176b675dfd7779db265a78c6359b7 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 23 Jun 2024 15:11:25 +0900 Subject: [PATCH 153/396] for-review: Reverse Linked List --- pullrequests/reverse_linked_list/step1.go | 32 ++++++++++++++++++++ pullrequests/reverse_linked_list/step2.go | 27 +++++++++++++++++ pullrequests/reverse_linked_list/step3.go | 36 +++++++++++++++++++++++ 3 files changed, 95 insertions(+) create mode 100644 pullrequests/reverse_linked_list/step1.go create mode 100644 pullrequests/reverse_linked_list/step2.go create mode 100644 pullrequests/reverse_linked_list/step3.go diff --git a/pullrequests/reverse_linked_list/step1.go b/pullrequests/reverse_linked_list/step1.go new file mode 100644 index 0000000..817bbea --- /dev/null +++ b/pullrequests/reverse_linked_list/step1.go @@ -0,0 +1,32 @@ +//lint:file-ignore U1000 Ignore all unused code +package reverselinkedlist + +/* +COMMENT +*/ + +type ListNode struct { + Val int + Next *ListNode +} + +func reverseList_step1(head *ListNode) *ListNode { + if head == nil { + return head + } + if head.Next == nil { + return head + } + + prev := head + next := head.Next + head.Next = nil + + for next != nil { + nextNext := next.Next + next.Next = prev + prev = next + next = nextNext + } + return prev +} diff --git a/pullrequests/reverse_linked_list/step2.go b/pullrequests/reverse_linked_list/step2.go new file mode 100644 index 0000000..d484257 --- /dev/null +++ b/pullrequests/reverse_linked_list/step2.go @@ -0,0 +1,27 @@ +//lint:file-ignore U1000 Ignore all unused code +package reverselinkedlist + +/* +COMMENT +*/ + +func reverseList_step2(head *ListNode) *ListNode { + if head == nil { + return head + } + if head.Next == nil { + return head + } + + prev := head + curr := head.Next + head.Next = nil + + for curr != nil { + next := curr.Next + curr.Next = prev + prev = curr + curr = next + } + return prev +} diff --git a/pullrequests/reverse_linked_list/step3.go b/pullrequests/reverse_linked_list/step3.go new file mode 100644 index 0000000..99e5b25 --- /dev/null +++ b/pullrequests/reverse_linked_list/step3.go @@ -0,0 +1,36 @@ +//lint:file-ignore U1000 Ignore all unused code +package reverselinkedlist + +/* + 時間: 2分、2分 + イテレーティブな方法と再帰を使った方法の2通りで解きました。 + + 質問: + - 20行目について、1行にまとめているのですが、読みやすさなどの点ではどう思いますか? + + - 与えられたhead自体を操作するのは避けた方が良いか?(例えばcurrなどの別の変数に代入して + から操作した方が良いか) + + - 変数名としてreversedHeadか、reversedListHeadのどちらの方が良いか? + - reversedListHeadだとこれぐらいのコードの短さで使うにしては少し長すぎるかなと思った + のでここではreversedHeadでも十分通じると思い、これにしました +*/ + +func reverseList_iterative_step3(head *ListNode) *ListNode { + var prev *ListNode + for head != nil { + prev, head, head.Next = head, head.Next, prev + } + return prev +} + +func reverseList_recurssive_step3(head *ListNode) *ListNode { + if head == nil || head.Next == nil { + return head + } + + next := head.Next + reversedHead := reverseList_recurssive_step3(next) + head.Next, next.Next = nil, head + return reversedHead +} From 601cac08d35b79cec4c4f9cde5c6a74d995fdb81 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 23 Jun 2024 15:38:30 +0900 Subject: [PATCH 154/396] for-review(reverse linked list): add comment --- pullrequests/reverse_linked_list/step3.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pullrequests/reverse_linked_list/step3.go b/pullrequests/reverse_linked_list/step3.go index 99e5b25..6ab2769 100644 --- a/pullrequests/reverse_linked_list/step3.go +++ b/pullrequests/reverse_linked_list/step3.go @@ -14,6 +14,10 @@ package reverselinkedlist - 変数名としてreversedHeadか、reversedListHeadのどちらの方が良いか? - reversedListHeadだとこれぐらいのコードの短さで使うにしては少し長すぎるかなと思った のでここではreversedHeadでも十分通じると思い、これにしました + + 他の人のPRを見て思ったこと + - スタックを使って解く方法も確かにあるなと思いました。パフォーマンス的には再帰を使って解く + 方法とほぼ同じ?(再帰もスタックを使っていると言えば使っている) */ func reverseList_iterative_step3(head *ListNode) *ListNode { From 123c521413b35ff9801433ddfe7e283a3631f33c Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 23 Jun 2024 16:01:50 +0900 Subject: [PATCH 155/396] for-review(reverse linked list): add comment --- pullrequests/reverse_linked_list/step3.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pullrequests/reverse_linked_list/step3.go b/pullrequests/reverse_linked_list/step3.go index 6ab2769..1262387 100644 --- a/pullrequests/reverse_linked_list/step3.go +++ b/pullrequests/reverse_linked_list/step3.go @@ -18,6 +18,13 @@ package reverselinkedlist 他の人のPRを見て思ったこと - スタックを使って解く方法も確かにあるなと思いました。パフォーマンス的には再帰を使って解く 方法とほぼ同じ?(再帰もスタックを使っていると言えば使っている) + + - スタックとヒープ + https://github.com/Ryotaro25/leetcode_first60/pull/8/files#r1617095525 + https://github.com/Ryotaro25/leetcode_first60/pull/8/files#r1616548694 + + - 再帰について + https://github.com/seal-azarashi/leetcode/pull/7/files#r1640157920 */ func reverseList_iterative_step3(head *ListNode) *ListNode { From 98a5a78e8869fd2419f66eab96c7ad46811b047c Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 25 Jun 2024 18:50:13 +0900 Subject: [PATCH 156/396] refactor Group Anagrams --- go/group_anagrams.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/go/group_anagrams.go b/go/group_anagrams.go index 7bf1317..bdce6cc 100644 --- a/go/group_anagrams.go +++ b/go/group_anagrams.go @@ -3,18 +3,18 @@ package main func groupAnagrams(strs []string) [][]string { m := make(map[[26]int][]string) - for _, s := range strs { + for _, word := range strs { var freq [26]int - for _, r := range s { + for _, r := range word { freq[r-'a']++ } - m[freq] = append(m[freq], s) + m[freq] = append(m[freq], word) } res := make([][]string, len(m)) i := 0 - for _, v := range m { - res[i] = v + for _, words := range m { + res[i] = words i++ } return res From 44cd41198bef36fb831622230e5cc681a7af5b64 Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 25 Jun 2024 18:51:44 +0900 Subject: [PATCH 157/396] revert change --- go/group_anagrams.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/go/group_anagrams.go b/go/group_anagrams.go index bdce6cc..7bf1317 100644 --- a/go/group_anagrams.go +++ b/go/group_anagrams.go @@ -3,18 +3,18 @@ package main func groupAnagrams(strs []string) [][]string { m := make(map[[26]int][]string) - for _, word := range strs { + for _, s := range strs { var freq [26]int - for _, r := range word { + for _, r := range s { freq[r-'a']++ } - m[freq] = append(m[freq], word) + m[freq] = append(m[freq], s) } res := make([][]string, len(m)) i := 0 - for _, words := range m { - res[i] = words + for _, v := range m { + res[i] = v i++ } return res From f38cc82e2468e8aa2b10ab08d05ea5e358821a40 Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 25 Jun 2024 18:52:24 +0900 Subject: [PATCH 158/396] refactor Group Anagrams --- go/group_anagrams.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/go/group_anagrams.go b/go/group_anagrams.go index 7bf1317..bdce6cc 100644 --- a/go/group_anagrams.go +++ b/go/group_anagrams.go @@ -3,18 +3,18 @@ package main func groupAnagrams(strs []string) [][]string { m := make(map[[26]int][]string) - for _, s := range strs { + for _, word := range strs { var freq [26]int - for _, r := range s { + for _, r := range word { freq[r-'a']++ } - m[freq] = append(m[freq], s) + m[freq] = append(m[freq], word) } res := make([][]string, len(m)) i := 0 - for _, v := range m { - res[i] = v + for _, words := range m { + res[i] = words i++ } return res From 3d7a79e4f85bf7464f394484bb1a8d7043392ae6 Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 25 Jun 2024 19:23:57 +0900 Subject: [PATCH 159/396] for-review: Group Anagrams --- pullrequests/group_anagrams/step1.go | 28 +++++++++++++++++++++++++ pullrequests/group_anagrams/step2.go | 25 ++++++++++++++++++++++ pullrequests/group_anagrams/step3.go | 31 ++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+) create mode 100644 pullrequests/group_anagrams/step1.go create mode 100644 pullrequests/group_anagrams/step2.go create mode 100644 pullrequests/group_anagrams/step3.go diff --git a/pullrequests/group_anagrams/step1.go b/pullrequests/group_anagrams/step1.go new file mode 100644 index 0000000..5b18719 --- /dev/null +++ b/pullrequests/group_anagrams/step1.go @@ -0,0 +1,28 @@ +//lint:file-ignore U1000 Ignore all unused code +package groupanagrams + +/* + すぐに思いついたのはソートした文字列をkeyとしてハッシュテーブルを使ってグルーピングすること。 + ただ、クイックソートの平均計算量はO(n log n)なので、O(n)でできればやりたいと思い、前に似た + ような問題を解いたことがあったので、与えられた条件に小文字しか使われないと書いてあったので、 + 配列のインデックスを用いて頻度を取得し、keyにすることにした。 +*/ + +func groupAnagrams_step1(strs []string) [][]string { + m := make(map[[26]int][]string) + for _, s := range strs { + var freq [26]int + for _, r := range s { + freq[r-'a']++ + } + m[freq] = append(m[freq], s) + } + + result := make([][]string, len(m)) + i := 0 + for _, v := range m { + result[i] = v + i++ + } + return result +} diff --git a/pullrequests/group_anagrams/step2.go b/pullrequests/group_anagrams/step2.go new file mode 100644 index 0000000..8ceb662 --- /dev/null +++ b/pullrequests/group_anagrams/step2.go @@ -0,0 +1,25 @@ +//lint:file-ignore U1000 Ignore all unused code +package groupanagrams + +/* + 変数名を改善した。 +*/ + +func groupAnagrams_step2(strs []string) [][]string { + m := make(map[[26]int][]string) + for _, s := range strs { + var freq [26]int + for _, r := range s { + freq[r-'a']++ + } + m[freq] = append(m[freq], s) + } + + res := make([][]string, len(m)) + i := 0 + for _, v := range m { + res[i] = v + i++ + } + return res +} diff --git a/pullrequests/group_anagrams/step3.go b/pullrequests/group_anagrams/step3.go new file mode 100644 index 0000000..2b40d00 --- /dev/null +++ b/pullrequests/group_anagrams/step3.go @@ -0,0 +1,31 @@ +//lint:file-ignore U1000 Ignore all unused code +package groupanagrams + +/* + 時間:3分 + 変数名をリファクタした。 + + 質問: + - resという変数名をどう思いますか? + - mという変数名をどう思いますか?(mapのmです) + - wordsという変数名をどう思いますか? +*/ + +func groupAnagrams_step3(strs []string) [][]string { + m := make(map[[26]int][]string) + for _, word := range strs { + var freq [26]int + for _, r := range word { + freq[r-'a']++ + } + m[freq] = append(m[freq], word) + } + + res := make([][]string, len(m)) + i := 0 + for _, words := range m { + res[i] = words + i++ + } + return res +} From ad8b689b276b398bccbfc079daafc5a6437c98e9 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 7 Jul 2024 00:59:57 +0900 Subject: [PATCH 160/396] create insertion sort --- basics/go.mod | 3 +++ basics/main.go | 15 +++++++++++++++ basics/sort/insertion.go | 15 +++++++++++++++ 3 files changed, 33 insertions(+) create mode 100644 basics/go.mod create mode 100644 basics/main.go create mode 100644 basics/sort/insertion.go diff --git a/basics/go.mod b/basics/go.mod new file mode 100644 index 0000000..142a151 --- /dev/null +++ b/basics/go.mod @@ -0,0 +1,3 @@ +module github.com/rihib/leetcode/basics + +go 1.21.5 diff --git a/basics/main.go b/basics/main.go new file mode 100644 index 0000000..aa5f2f6 --- /dev/null +++ b/basics/main.go @@ -0,0 +1,15 @@ +package main + +import ( + "fmt" + + "github.com/rihib/leetcode/basics/sort" +) + +func main() { + nums := []int{4, 3, 2, 1} + sortedNums := sort.Insertion(nums) + for _, n := range sortedNums { + fmt.Println(n) + } +} diff --git a/basics/sort/insertion.go b/basics/sort/insertion.go new file mode 100644 index 0000000..e8d2400 --- /dev/null +++ b/basics/sort/insertion.go @@ -0,0 +1,15 @@ +package sort + +func Insertion(nums []int) []int { + for sorted := 0; sorted < len(nums)-1; sorted++ { + if nums[sorted] > nums[sorted+1] { + for j := sorted; j >= 0; j-- { + if nums[j] <= nums[j+1] { + break + } + nums[j], nums[j+1] = nums[j+1], nums[j] + } + } + } + return nums +} From c577c142a28aad9a5f6195ca2953be398bbdbe7e Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 7 Jul 2024 14:50:04 +0900 Subject: [PATCH 161/396] refactor insertion sort --- basics/main.go | 11 ++++++++--- basics/sort/insertion.go | 14 ++++++-------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/basics/main.go b/basics/main.go index aa5f2f6..37c2cd5 100644 --- a/basics/main.go +++ b/basics/main.go @@ -8,8 +8,13 @@ import ( func main() { nums := []int{4, 3, 2, 1} - sortedNums := sort.Insertion(nums) - for _, n := range sortedNums { - fmt.Println(n) + sorted := sort.Insertion(nums) + print(sorted) +} + +func print(nums []int) { + for _, n := range nums { + fmt.Printf("%d ", n) } + fmt.Print("\n") } diff --git a/basics/sort/insertion.go b/basics/sort/insertion.go index e8d2400..9be6a03 100644 --- a/basics/sort/insertion.go +++ b/basics/sort/insertion.go @@ -1,15 +1,13 @@ package sort func Insertion(nums []int) []int { - for sorted := 0; sorted < len(nums)-1; sorted++ { - if nums[sorted] > nums[sorted+1] { - for j := sorted; j >= 0; j-- { - if nums[j] <= nums[j+1] { - break - } - nums[j], nums[j+1] = nums[j+1], nums[j] - } + for i := 1; i < len(nums); i++ { + curr := nums[i] + j := i - 1 + for ; j >= 0 && nums[j] > curr; j-- { + nums[j+1] = nums[j] } + nums[j+1] = curr } return nums } From 90b8690edea9476d18dfbf8c6e965e13b0362ad9 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 7 Jul 2024 15:48:48 +0900 Subject: [PATCH 162/396] create Selection Sort --- basics/sort/selection.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 basics/sort/selection.go diff --git a/basics/sort/selection.go b/basics/sort/selection.go new file mode 100644 index 0000000..95fca0c --- /dev/null +++ b/basics/sort/selection.go @@ -0,0 +1,14 @@ +package sort + +func Selection(nums []int) []int { + for i := 0; i < len(nums); i++ { + min, minIdx := nums[i], i + for j := i + 1; j < len(nums); j++ { + if min > nums[j] { + min, minIdx = nums[j], j + } + } + nums[i], nums[minIdx] = nums[minIdx], nums[i] + } + return nums +} From 704fc18814097525637b2c63d175e120fb1c3f31 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 7 Jul 2024 16:10:26 +0900 Subject: [PATCH 163/396] refactor basics/main.go --- basics/main.go | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/basics/main.go b/basics/main.go index 37c2cd5..2efa7de 100644 --- a/basics/main.go +++ b/basics/main.go @@ -2,17 +2,47 @@ package main import ( "fmt" + "reflect" + "runtime" + "strings" "github.com/rihib/leetcode/basics/sort" ) func main() { - nums := []int{4, 3, 2, 1} - sorted := sort.Insertion(nums) - print(sorted) + testcases := [][]int{ + {}, + {1}, + {1, 1}, + {3, 2, 1}, + {3, 2, 2, 1}, + {4, 3, 2, 1}, + {4, 4, 3, 3, 2, 2, 1, 1}, + } + + runSort(sort.Insertion, testcases) + runSort(sort.Selection, testcases) +} + +func runSort(f func([]int) []int, testcases [][]int) { + fmt.Println(getFunctionName(f)) + for _, nums := range testcases { + sorted := f(nums) + print(sorted) + } + fmt.Print("\n") +} + +func getFunctionName(f interface{}) string { + full := runtime.FuncForPC(reflect.ValueOf(f).Pointer()).Name() + n := strings.TrimPrefix(full, "github.com/rihib/leetcode/basics/sort.") + return n } func print(nums []int) { + if len(nums) == 0 { + fmt.Print("none") + } for _, n := range nums { fmt.Printf("%d ", n) } From 12b3b95668201b92913b425a4e4a17ad31e91159 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 7 Jul 2024 16:30:36 +0900 Subject: [PATCH 164/396] refactor Selection Sort --- basics/main.go | 6 ++++-- basics/sort/selection.go | 12 ++++++++---- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/basics/main.go b/basics/main.go index 2efa7de..9159d04 100644 --- a/basics/main.go +++ b/basics/main.go @@ -35,13 +35,15 @@ func runSort(f func([]int) []int, testcases [][]int) { func getFunctionName(f interface{}) string { full := runtime.FuncForPC(reflect.ValueOf(f).Pointer()).Name() - n := strings.TrimPrefix(full, "github.com/rihib/leetcode/basics/sort.") + n := "=====" + + strings.TrimPrefix(full, "github.com/rihib/leetcode/basics/sort.") + + "=====" return n } func print(nums []int) { if len(nums) == 0 { - fmt.Print("none") + fmt.Print("Empty") } for _, n := range nums { fmt.Printf("%d ", n) diff --git a/basics/sort/selection.go b/basics/sort/selection.go index 95fca0c..01ad1eb 100644 --- a/basics/sort/selection.go +++ b/basics/sort/selection.go @@ -1,11 +1,15 @@ package sort func Selection(nums []int) []int { - for i := 0; i < len(nums); i++ { - min, minIdx := nums[i], i + // Selection Sort is unstable as shown below: + // 1. {2', 1, 2, 1} + // 2. {1, 2', 2, 1} + // 3. {1, 1, 2, 2'} + for i := 0; i < len(nums)-1; i++ { + minIdx := i for j := i + 1; j < len(nums); j++ { - if min > nums[j] { - min, minIdx = nums[j], j + if nums[minIdx] > nums[j] { + minIdx = j } } nums[i], nums[minIdx] = nums[minIdx], nums[i] From 16a040703f4d8b572162ba8ba258e37e6e7966b0 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 7 Jul 2024 22:14:31 +0900 Subject: [PATCH 165/396] create Quicksort --- basics/main.go | 1 + basics/sort/quicksort.go | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 basics/sort/quicksort.go diff --git a/basics/main.go b/basics/main.go index 9159d04..2727958 100644 --- a/basics/main.go +++ b/basics/main.go @@ -22,6 +22,7 @@ func main() { runSort(sort.Insertion, testcases) runSort(sort.Selection, testcases) + runSort(sort.Quicksort, testcases) } func runSort(f func([]int) []int, testcases [][]int) { diff --git a/basics/sort/quicksort.go b/basics/sort/quicksort.go new file mode 100644 index 0000000..ed44330 --- /dev/null +++ b/basics/sort/quicksort.go @@ -0,0 +1,23 @@ +package sort + +func Quicksort(nums []int) []int { + if len(nums) <= 1 { + return nums + } + pivot := partition(nums) + Quicksort(nums[:pivot]) + Quicksort(nums[pivot+1:]) + return nums +} + +func partition(nums []int) int { + i := 1 + for j := 1; j < len(nums); j++ { + if nums[j] < nums[0] { + nums[i], nums[j] = nums[j], nums[i] + i++ + } + } + nums[i-1], nums[0] = nums[0], nums[i-1] + return i - 1 +} From d8ad7713d63d3d4faa6b0319fbf92949764466f1 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 7 Jul 2024 22:17:45 +0900 Subject: [PATCH 166/396] refactor Quicksort --- basics/sort/quicksort.go | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/basics/sort/quicksort.go b/basics/sort/quicksort.go index ed44330..a3da376 100644 --- a/basics/sort/quicksort.go +++ b/basics/sort/quicksort.go @@ -11,13 +11,18 @@ func Quicksort(nums []int) []int { } func partition(nums []int) int { - i := 1 - for j := 1; j < len(nums); j++ { - if nums[j] < nums[0] { - nums[i], nums[j] = nums[j], nums[i] - i++ + l, r := 1, len(nums)-1 + for l <= r { + for l <= r && nums[l] <= nums[0] { + l++ + } + for l <= r && nums[r] > nums[0] { + r-- + } + if l < r { + nums[l], nums[r] = nums[r], nums[l] } } - nums[i-1], nums[0] = nums[0], nums[i-1] - return i - 1 + nums[0], nums[r] = nums[r], nums[0] + return r } From 46b35eeba036872e7eb2a2bf2d8a1b18bc969c2d Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 7 Jul 2024 22:21:06 +0900 Subject: [PATCH 167/396] add comment for Quicksort --- basics/sort/quicksort.go | 1 + 1 file changed, 1 insertion(+) diff --git a/basics/sort/quicksort.go b/basics/sort/quicksort.go index a3da376..cf62742 100644 --- a/basics/sort/quicksort.go +++ b/basics/sort/quicksort.go @@ -10,6 +10,7 @@ func Quicksort(nums []int) []int { return nums } +// Using the two-pointer technique from both ends for better performance func partition(nums []int) int { l, r := 1, len(nums)-1 for l <= r { From 51fa97bfd49cc9e135ab32c2356914d2445a8628 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 7 Jul 2024 22:23:30 +0900 Subject: [PATCH 168/396] add comment for Quicksort --- basics/sort/quicksort.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/basics/sort/quicksort.go b/basics/sort/quicksort.go index cf62742..9425052 100644 --- a/basics/sort/quicksort.go +++ b/basics/sort/quicksort.go @@ -11,6 +11,8 @@ func Quicksort(nums []int) []int { } // Using the two-pointer technique from both ends for better performance +// The single-direction approach starting from the beginning is +// more likely to result in skewed partitions func partition(nums []int) int { l, r := 1, len(nums)-1 for l <= r { From 3e055ac55f859f5bc895ffbc832eeaa8d80fdff2 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 7 Jul 2024 23:17:14 +0900 Subject: [PATCH 169/396] create Merge Sort --- basics/main.go | 1 + basics/sort/merge.go | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 basics/sort/merge.go diff --git a/basics/main.go b/basics/main.go index 2727958..88b0c3a 100644 --- a/basics/main.go +++ b/basics/main.go @@ -23,6 +23,7 @@ func main() { runSort(sort.Insertion, testcases) runSort(sort.Selection, testcases) runSort(sort.Quicksort, testcases) + runSort(sort.Merge, testcases) } func runSort(f func([]int) []int, testcases [][]int) { diff --git a/basics/sort/merge.go b/basics/sort/merge.go new file mode 100644 index 0000000..f50d480 --- /dev/null +++ b/basics/sort/merge.go @@ -0,0 +1,32 @@ +package sort + +func Merge(nums []int) []int { + if len(nums) <= 1 { + return nums + } + + left := Merge(nums[:len(nums)/2]) + right := Merge(nums[len(nums)/2:]) + + i, l, r := 0, 0, 0 + for l < len(left) && r < len(right) { + if left[l] < right[r] { + nums[i] = left[l] + l++ + } else { + nums[i] = right[r] + r++ + } + i++ + } + for ; l < len(left); l++ { + nums[i] = left[l] + i++ + } + for ; r < len(right); r++ { + nums[i] = right[r] + i++ + } + + return nums +} From a812fbfb475e6066cce9f955709878ea97fe8c93 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 7 Jul 2024 23:30:09 +0900 Subject: [PATCH 170/396] Add empty Timsort file --- basics/main.go | 1 + basics/sort/timsort.go | 3 +++ 2 files changed, 4 insertions(+) create mode 100644 basics/sort/timsort.go diff --git a/basics/main.go b/basics/main.go index 88b0c3a..df58397 100644 --- a/basics/main.go +++ b/basics/main.go @@ -17,6 +17,7 @@ func main() { {3, 2, 1}, {3, 2, 2, 1}, {4, 3, 2, 1}, + {1, 2, 3, 4}, {4, 4, 3, 3, 2, 2, 1, 1}, } diff --git a/basics/sort/timsort.go b/basics/sort/timsort.go new file mode 100644 index 0000000..35e5004 --- /dev/null +++ b/basics/sort/timsort.go @@ -0,0 +1,3 @@ +package sort + +// TODO: implement Tim Sort From d2785fee02fab1e705dd6e48d2d4804284813fb2 Mon Sep 17 00:00:00 2001 From: rihib Date: Wed, 10 Jul 2024 18:32:54 +0900 Subject: [PATCH 171/396] create Priority Queue --- basics/main.go | 27 +++++++++++++ basics/queue/priorityqueue.go | 73 +++++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 basics/queue/priorityqueue.go diff --git a/basics/main.go b/basics/main.go index df58397..26b6de4 100644 --- a/basics/main.go +++ b/basics/main.go @@ -6,10 +6,16 @@ import ( "runtime" "strings" + "github.com/rihib/leetcode/basics/queue" "github.com/rihib/leetcode/basics/sort" ) func main() { + testSort() + testPriorityQueue() +} + +func testSort() { testcases := [][]int{ {}, {1}, @@ -53,3 +59,24 @@ func print(nums []int) { } fmt.Print("\n") } + +func testPriorityQueue() { + fmt.Println("=====Priority Queue=====") + pq := new(queue.PriorityQueue) + + node, l, isEmpty := pq.Peek(), pq.Len(), pq.IsEmpty() + fmt.Printf("Peek returns nil: %t, Len: %d, IsEmpty: %t\n", node == nil, l, isEmpty) + + node = pq.Pop() + fmt.Printf("Pop returns nil: %t\n", node == nil) + + node = &queue.Node{Priority: 100, Val: 1} + fmt.Printf("Push Node: Priority is %d, Val is %d\n", node.Priority, node.Val) + pq.Push(*node) + + node, l, isEmpty = pq.Peek(), pq.Len(), pq.IsEmpty() + fmt.Printf("Priority: %d, Val: %d, Len: %d, IsEmpty: %t\n", node.Priority, node.Val, l, isEmpty) + + node = pq.Pop() + fmt.Printf("Pop Node: Priority is %d, Val is %d\n", node.Priority, node.Val) +} diff --git a/basics/queue/priorityqueue.go b/basics/queue/priorityqueue.go new file mode 100644 index 0000000..d590bb9 --- /dev/null +++ b/basics/queue/priorityqueue.go @@ -0,0 +1,73 @@ +package queue + +type Node struct { + Val int + Priority int +} + +type PriorityQueue struct { + heap []Node +} + +func (pq *PriorityQueue) Push(n Node) { + pq.heap = append(pq.heap, n) + child := len(pq.heap) - 1 + parent := (child - 1) / 2 + for child > 0 && pq.heap[parent].Priority < n.Priority { + pq.heap[parent], pq.heap[child] = pq.heap[child], pq.heap[parent] + child = parent + parent = (child - 1) / 2 + } +} + +func (pq *PriorityQueue) Pop() *Node { + if len(pq.heap) == 0 { + return nil + } + + n := pq.heap[0] + tail := len(pq.heap) - 1 + pq.heap[0], pq.heap[tail] = pq.heap[tail], pq.heap[0] + pq.heap = pq.heap[:tail] + + for parent := 0; ; { + l, r := parent*2+1, parent*2+2 + if len(pq.heap) <= l { + break + } + if len(pq.heap) <= r { + if pq.heap[parent].Priority < pq.heap[l].Priority { + pq.heap[parent], pq.heap[l] = pq.heap[l], pq.heap[parent] + parent = l + continue + } + } + if pq.heap[parent].Priority < pq.heap[l].Priority || + pq.heap[parent].Priority < pq.heap[r].Priority { + if pq.heap[l].Priority < pq.heap[r].Priority { + pq.heap[parent], pq.heap[l] = pq.heap[l], pq.heap[parent] + parent = l + } else { + pq.heap[parent], pq.heap[r] = pq.heap[r], pq.heap[parent] + parent = r + } + } + } + + return &n +} + +func (pq *PriorityQueue) Peek() *Node { + if len(pq.heap) == 0 { + return nil + } + return &pq.heap[0] +} + +func (pq *PriorityQueue) IsEmpty() bool { + return len(pq.heap) == 0 +} + +func (pq *PriorityQueue) Len() int { + return len(pq.heap) +} From e20afaa575bc15ca7fca91ad845e9164d4dab475 Mon Sep 17 00:00:00 2001 From: rihib Date: Wed, 10 Jul 2024 18:44:43 +0900 Subject: [PATCH 172/396] refactor Priority Queue --- basics/main.go | 32 +++++++++++++++++++++++++++++++- basics/queue/priorityqueue.go | 26 +++++++++----------------- 2 files changed, 40 insertions(+), 18 deletions(-) diff --git a/basics/main.go b/basics/main.go index 26b6de4..b392580 100644 --- a/basics/main.go +++ b/basics/main.go @@ -75,8 +75,38 @@ func testPriorityQueue() { pq.Push(*node) node, l, isEmpty = pq.Peek(), pq.Len(), pq.IsEmpty() - fmt.Printf("Priority: %d, Val: %d, Len: %d, IsEmpty: %t\n", node.Priority, node.Val, l, isEmpty) + fmt.Printf("Peek: Priority is %d and Val is %d, Len: %d, IsEmpty: %t\n", node.Priority, node.Val, l, isEmpty) node = pq.Pop() fmt.Printf("Pop Node: Priority is %d, Val is %d\n", node.Priority, node.Val) + + node, l, isEmpty = pq.Peek(), pq.Len(), pq.IsEmpty() + fmt.Printf("Peek returns nil: %t, Len: %d, IsEmpty: %t\n", node == nil, l, isEmpty) + + node = &queue.Node{Priority: 100, Val: 1} + fmt.Printf("Push Node: Priority is %d, Val is %d\n", node.Priority, node.Val) + pq.Push(*node) + + node = &queue.Node{Priority: 200, Val: 2} + fmt.Printf("Push Node: Priority is %d, Val is %d\n", node.Priority, node.Val) + pq.Push(*node) + + node = &queue.Node{Priority: 300, Val: 3} + fmt.Printf("Push Node: Priority is %d, Val is %d\n", node.Priority, node.Val) + pq.Push(*node) + + node, l, isEmpty = pq.Peek(), pq.Len(), pq.IsEmpty() + fmt.Printf("Peek: Priority is %d and Val is %d, Len: %d, IsEmpty: %t\n", node.Priority, node.Val, l, isEmpty) + + node = pq.Pop() + fmt.Printf("Pop Node: Priority is %d, Val is %d\n", node.Priority, node.Val) + + node = pq.Pop() + fmt.Printf("Pop Node: Priority is %d, Val is %d\n", node.Priority, node.Val) + + node = pq.Pop() + fmt.Printf("Pop Node: Priority is %d, Val is %d\n", node.Priority, node.Val) + + node, l, isEmpty = pq.Peek(), pq.Len(), pq.IsEmpty() + fmt.Printf("Peek returns nil: %t, Len: %d, IsEmpty: %t\n", node == nil, l, isEmpty) } diff --git a/basics/queue/priorityqueue.go b/basics/queue/priorityqueue.go index d590bb9..5195790 100644 --- a/basics/queue/priorityqueue.go +++ b/basics/queue/priorityqueue.go @@ -32,26 +32,18 @@ func (pq *PriorityQueue) Pop() *Node { for parent := 0; ; { l, r := parent*2+1, parent*2+2 - if len(pq.heap) <= l { - break + largest := parent + if l < len(pq.heap) && pq.heap[l].Priority > pq.heap[parent].Priority { + largest = l } - if len(pq.heap) <= r { - if pq.heap[parent].Priority < pq.heap[l].Priority { - pq.heap[parent], pq.heap[l] = pq.heap[l], pq.heap[parent] - parent = l - continue - } + if r < len(pq.heap) && pq.heap[r].Priority > pq.heap[parent].Priority { + largest = r } - if pq.heap[parent].Priority < pq.heap[l].Priority || - pq.heap[parent].Priority < pq.heap[r].Priority { - if pq.heap[l].Priority < pq.heap[r].Priority { - pq.heap[parent], pq.heap[l] = pq.heap[l], pq.heap[parent] - parent = l - } else { - pq.heap[parent], pq.heap[r] = pq.heap[r], pq.heap[parent] - parent = r - } + if largest == parent { + break } + pq.heap[parent], pq.heap[largest] = pq.heap[largest], pq.heap[parent] + parent = largest } return &n From ae643615432f7b638fafeca7234fc4b3e7360ada Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 11 Jul 2024 00:51:50 +0900 Subject: [PATCH 173/396] create Dijkstra --- basics/graph/dijkstra.go | 43 +++++++++++++++++++++++++++++++++++ basics/graph/priorityqueue.go | 37 ++++++++++++++++++++++++++++++ basics/main.go | 20 ++++++++++++++++ 3 files changed, 100 insertions(+) create mode 100644 basics/graph/dijkstra.go create mode 100644 basics/graph/priorityqueue.go diff --git a/basics/graph/dijkstra.go b/basics/graph/dijkstra.go new file mode 100644 index 0000000..34f8472 --- /dev/null +++ b/basics/graph/dijkstra.go @@ -0,0 +1,43 @@ +package graph + +import ( + "container/heap" + "math" +) + +type Edge struct { + To int + Weight int +} + +// adjacency list +type Graph struct { + Nodes map[int][]Edge +} + +func (g *Graph) Dijkstra(source int) map[int]int { + dist := make(map[int]int) + for node := range g.Nodes { + dist[node] = math.MaxInt64 + } + dist[source] = 0 + + pq := make(PriorityQueue, 0) + heap.Init(&pq) + heap.Push(&pq, &Item{Node: source, Priority: 0}) + + for pq.Len() > 0 { + u := heap.Pop(&pq).(*Item).Node + + for _, edge := range g.Nodes[u] { + v := edge.To + weight := edge.Weight + if dist[u]+weight < dist[v] { + dist[v] = dist[u] + weight + heap.Push(&pq, &Item{Node: v, Priority: dist[v]}) + } + } + } + + return dist +} diff --git a/basics/graph/priorityqueue.go b/basics/graph/priorityqueue.go new file mode 100644 index 0000000..823fa3d --- /dev/null +++ b/basics/graph/priorityqueue.go @@ -0,0 +1,37 @@ +package graph + +type PriorityQueue []*Item + +type Item struct { + Node int + Priority int + Index int +} + +func (pq PriorityQueue) Len() int { return len(pq) } + +func (pq PriorityQueue) Less(i, j int) bool { + return pq[i].Priority < pq[j].Priority +} + +func (pq PriorityQueue) Swap(i, j int) { + pq[i], pq[j] = pq[j], pq[i] + pq[i].Index = i + pq[j].Index = j +} + +func (pq *PriorityQueue) Push(x interface{}) { + n := len(*pq) + item := x.(*Item) + item.Index = n + *pq = append(*pq, item) +} + +func (pq *PriorityQueue) Pop() interface{} { + old := *pq + n := len(old) + item := old[n-1] + item.Index = -1 + *pq = old[0 : n-1] + return item +} diff --git a/basics/main.go b/basics/main.go index b392580..8971abc 100644 --- a/basics/main.go +++ b/basics/main.go @@ -6,6 +6,7 @@ import ( "runtime" "strings" + "github.com/rihib/leetcode/basics/graph" "github.com/rihib/leetcode/basics/queue" "github.com/rihib/leetcode/basics/sort" ) @@ -13,6 +14,7 @@ import ( func main() { testSort() testPriorityQueue() + testDijkstra() } func testSort() { @@ -109,4 +111,22 @@ func testPriorityQueue() { node, l, isEmpty = pq.Peek(), pq.Len(), pq.IsEmpty() fmt.Printf("Peek returns nil: %t, Len: %d, IsEmpty: %t\n", node == nil, l, isEmpty) + + fmt.Println("") +} + +func testDijkstra() { + fmt.Println("=====Dijkstra=====") + g := &graph.Graph{ + Nodes: make(map[int][]graph.Edge), + } + g.Nodes[0] = []graph.Edge{{To: 1, Weight: 4}, {To: 2, Weight: 1}} + g.Nodes[1] = []graph.Edge{{To: 3, Weight: 1}} + g.Nodes[2] = []graph.Edge{{To: 1, Weight: 2}, {To: 3, Weight: 5}} + g.Nodes[3] = []graph.Edge{} + + dist := g.Dijkstra(0) + for node, distance := range dist { + fmt.Printf("Distance from node 0 to node %d is %d\n", node, distance) + } } From 419bb8431940d7ff58d569182d47e3654a56bcea Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 4 Aug 2024 14:44:13 +0900 Subject: [PATCH 174/396] pullrequests/contains_duplicate --- pullrequests/contains_duplicate/step1.go | 25 ++++++++++++++++++++ pullrequests/contains_duplicate/step2.go | 30 ++++++++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 pullrequests/contains_duplicate/step1.go create mode 100644 pullrequests/contains_duplicate/step2.go diff --git a/pullrequests/contains_duplicate/step1.go b/pullrequests/contains_duplicate/step1.go new file mode 100644 index 0000000..e48d861 --- /dev/null +++ b/pullrequests/contains_duplicate/step1.go @@ -0,0 +1,25 @@ +//lint:file-ignore U1000 Ignore all unused code +package containsduplicate + +/* +かなり前に解いたときのもの(コミット履歴からとってきました)なので +詳細は忘れてしまいました(すいません)。 +基本的にはマップを使って重複を見つけようとしています。 + +- Step1の要素数が1以下の場合の処理はなくても変わらないことに気づいたのでStep2ではなくしています。 +- valueの意味でvを使ったのですが、nのほうがnumsと対応していてより良いかなと思ったので同様にStep2ではnを使うようにしました。 +- nmもnumsMapのつもりで使ったのですが同様に他にマップが使われているわけではないのでStep2では単にmとしました。 +*/ +func containsDuplicate_step1(nums []int) bool { + if len(nums) <= 1 { + return false + } + nm := make(map[int]struct{}) + for _, v := range nums { + if _, ok := nm[v]; ok { + return true + } + nm[v] = struct{}{} + } + return false +} diff --git a/pullrequests/contains_duplicate/step2.go b/pullrequests/contains_duplicate/step2.go new file mode 100644 index 0000000..09180e8 --- /dev/null +++ b/pullrequests/contains_duplicate/step2.go @@ -0,0 +1,30 @@ +//lint:file-ignore U1000 Ignore all unused code +package containsduplicate + +/* +時間:1分 +よりシンプルに書くようにしました。 +また他の解法として最後に要素数を比較する方法もあると思います。 + +質問 +- m, nという変数名をどう思いますか?(個人的にはこれぐらいの短いコードであれば逆に長い変数名をつけるのも良くないのではと思ったためあえて一文字の変数を使いました) +- 2つの解法のうちどちらのがほうが良いと思いますか?(個人的には下の解法はコード数が短くなるものの、必ずnumsを全て見ないといけないので、その点で若干パフォーマンスは劣るのかなと思っています。気にしなくても良いぐらいの話かもしれませんが、、) +*/ +func containsDuplicate_step2(nums []int) bool { + m := make(map[int]struct{}) + for _, n := range nums { + if _, ok := m[n]; ok { + return true + } + m[n] = struct{}{} + } + return false +} + +func containsDuplicate_anothersolution(nums []int) bool { + m := make(map[int]struct{}) + for _, n := range nums { + m[n] = struct{}{} + } + return len(nums) > len(m) +} From 8ed8d3a82ce3c27aec8907f65feef631ccebe667 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 4 Aug 2024 15:47:51 +0900 Subject: [PATCH 175/396] refactor Valid Anagram --- go/valid_anagram.go | 31 ++++++++++++++++++++-------- go/valid_anagram_another_solution.go | 20 ------------------ 2 files changed, 22 insertions(+), 29 deletions(-) delete mode 100644 go/valid_anagram_another_solution.go diff --git a/go/valid_anagram.go b/go/valid_anagram.go index 9dfbdaf..d53476e 100644 --- a/go/valid_anagram.go +++ b/go/valid_anagram.go @@ -2,18 +2,31 @@ package main func isAnagram(s string, t string) bool { - if len(s) != len(t) { - return false + var frequency [26]int + for _, r := range s { + frequency[r-'a']++ } - - var freq [26]int - for i := 0; i < len(s); i++ { - freq[s[i]-'a']++ - freq[t[i]-'a']-- + for _, r := range t { + frequency[r-'a']-- + } + for _, n := range frequency { + if n != 0 { + return false + } } + return true +} - for _, v := range freq { - if v != 0 { +func isAnagram_unicode(s string, t string) bool { + frequency := make(map[rune]int) + for _, r := range s { + frequency[r]++ + } + for _, r := range t { + frequency[r]-- + } + for _, n := range frequency { + if n != 0 { return false } } diff --git a/go/valid_anagram_another_solution.go b/go/valid_anagram_another_solution.go deleted file mode 100644 index 2c3419a..0000000 --- a/go/valid_anagram_another_solution.go +++ /dev/null @@ -1,20 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package main - -func isAnagram_unicode(s string, t string) bool { - if len(s) != len(t) { - return false - } - - freq := make(map[rune]int) - for _, r := range s { - freq[r]++ - } - for _, r := range t { - freq[r]-- - if freq[r] < 0 { - return false - } - } - return true -} From 4f14395f6103bccec886fcd90b7a899387fe3394 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 4 Aug 2024 16:16:37 +0900 Subject: [PATCH 176/396] pullrequests/valid_anagram --- pullrequests/valid_anagram/step1.go | 45 +++++++++++++++++++++++++++++ pullrequests/valid_anagram/step2.go | 41 ++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 pullrequests/valid_anagram/step1.go create mode 100644 pullrequests/valid_anagram/step2.go diff --git a/pullrequests/valid_anagram/step1.go b/pullrequests/valid_anagram/step1.go new file mode 100644 index 0000000..63a4aca --- /dev/null +++ b/pullrequests/valid_anagram/step1.go @@ -0,0 +1,45 @@ +//lint:file-ignore U1000 Ignore all unused code +package validanagram + +/* +かなり前に解いたものなので、詳細については忘れてしましました。 +小文字のアルファベットのみが入力として与えられる場合と、Unicode文字も含まれる場合の2つの解法が含まれています。 + +基本的にはそれぞれの文字列に含まれる文字の種類と数が一致しているかを見ています。 +下の解法について、40行目で0未満になった場合のみfalseを返すのは一見おかしいように見えますが、30行目で文字数が等しいことを確認しているため、一方より多い文字があれば何かの文字は少なくなるはずであるため、ロジック的には問題ないと思います。 +*/ +func isAnagram_step1(s string, t string) bool { + if len(s) != len(t) { + return false + } + + var freq [26]int + for i := 0; i < len(s); i++ { + freq[s[i]-'a']++ + freq[t[i]-'a']-- + } + for _, v := range freq { + if v != 0 { + return false + } + } + return true +} + +func isAnagram_unicode_step1(s string, t string) bool { + if len(s) != len(t) { + return false + } + + freq := make(map[rune]int) + for _, r := range s { + freq[r]++ + } + for _, r := range t { + freq[r]-- + if freq[r] < 0 { + return false + } + } + return true +} diff --git a/pullrequests/valid_anagram/step2.go b/pullrequests/valid_anagram/step2.go new file mode 100644 index 0000000..1867720 --- /dev/null +++ b/pullrequests/valid_anagram/step2.go @@ -0,0 +1,41 @@ +//lint:file-ignore U1000 Ignore all unused code +package validanagram + +/* +よりシンプルにわかりやすく書くようにしました。例えばfreqのように省略するのではなくfrequencyにしました。 + +上については、Goの場合、s[i]のようにアクセスするとバイト列にアクセスすることになるので、今回の場合はたまたまascii文字しか入力として与えられないので問題ないのですが、あまりよろしくないと思ったので文字としてアクセスするように変更しました。 + +下の解法についてはStep1のロジックがわかりづらかったので、より明確になるように変更しました。 +*/ +func isAnagram_step2(s string, t string) bool { + var frequency [26]int + for _, r := range s { + frequency[r-'a']++ + } + for _, r := range t { + frequency[r-'a']-- + } + for _, n := range frequency { + if n != 0 { + return false + } + } + return true +} + +func isAnagram_unicode_step2(s string, t string) bool { + frequency := make(map[rune]int) + for _, r := range s { + frequency[r]++ + } + for _, r := range t { + frequency[r]-- + } + for _, n := range frequency { + if n != 0 { + return false + } + } + return true +} From 23df18b9336de4ed32a37439365dd7f09bd6edff Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 6 Aug 2024 14:35:17 +0900 Subject: [PATCH 177/396] Add Two Numbers --- go/add_two_numbers.go | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 go/add_two_numbers.go diff --git a/go/add_two_numbers.go b/go/add_two_numbers.go new file mode 100644 index 0000000..3c9bdc2 --- /dev/null +++ b/go/add_two_numbers.go @@ -0,0 +1,37 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode { + dummy := new(ListNode) + dummy.Next = new(ListNode) + dummy.Next.Val = 0 + curr := dummy + for l1 != nil && l2 != nil { + curr = curr.Next + sum := l1.Val + l2.Val + curr.Val + curr.Val = sum % 10 + curr.Next = new(ListNode) + curr.Next.Val = sum / 10 + l1, l2 = l1.Next, l2.Next + } + for l1 != nil { + curr = curr.Next + sum := l1.Val + curr.Val + curr.Val = sum % 10 + curr.Next = new(ListNode) + curr.Next.Val = sum / 10 + l1 = l1.Next + } + for l2 != nil { + curr = curr.Next + sum := l2.Val + curr.Val + curr.Val = sum % 10 + curr.Next = new(ListNode) + curr.Next.Val = sum / 10 + l2 = l2.Next + } + if curr.Next.Val == 0 { + curr.Next = nil + } + return dummy.Next +} From b3bc7f665d03532ecec2e36bea8e37ee0095eb5d Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 6 Aug 2024 14:40:20 +0900 Subject: [PATCH 178/396] refactor Add Two Numbers --- go/add_two_numbers.go | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/go/add_two_numbers.go b/go/add_two_numbers.go index 3c9bdc2..d2fb90f 100644 --- a/go/add_two_numbers.go +++ b/go/add_two_numbers.go @@ -6,29 +6,20 @@ func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode { dummy.Next = new(ListNode) dummy.Next.Val = 0 curr := dummy - for l1 != nil && l2 != nil { + for l1 != nil || l2 != nil { curr = curr.Next - sum := l1.Val + l2.Val + curr.Val + sum := curr.Val + if l1 != nil { + sum += l1.Val + l1 = l1.Next + } + if l2 != nil { + sum += l2.Val + l2 = l2.Next + } curr.Val = sum % 10 curr.Next = new(ListNode) curr.Next.Val = sum / 10 - l1, l2 = l1.Next, l2.Next - } - for l1 != nil { - curr = curr.Next - sum := l1.Val + curr.Val - curr.Val = sum % 10 - curr.Next = new(ListNode) - curr.Next.Val = sum / 10 - l1 = l1.Next - } - for l2 != nil { - curr = curr.Next - sum := l2.Val + curr.Val - curr.Val = sum % 10 - curr.Next = new(ListNode) - curr.Next.Val = sum / 10 - l2 = l2.Next } if curr.Next.Val == 0 { curr.Next = nil From 2ce1839329ac5b71621825ce800f0b010efc63ee Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 6 Aug 2024 15:03:06 +0900 Subject: [PATCH 179/396] refactor Add Two Numbers --- go/add_two_numbers.go | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/go/add_two_numbers.go b/go/add_two_numbers.go index d2fb90f..2bf7f7a 100644 --- a/go/add_two_numbers.go +++ b/go/add_two_numbers.go @@ -3,12 +3,10 @@ package main func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode { dummy := new(ListNode) - dummy.Next = new(ListNode) - dummy.Next.Val = 0 curr := dummy - for l1 != nil || l2 != nil { - curr = curr.Next - sum := curr.Val + carry := 0 + for l1 != nil || l2 != nil || carry != 0 { + sum := carry if l1 != nil { sum += l1.Val l1 = l1.Next @@ -17,12 +15,9 @@ func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode { sum += l2.Val l2 = l2.Next } - curr.Val = sum % 10 - curr.Next = new(ListNode) - curr.Next.Val = sum / 10 - } - if curr.Next.Val == 0 { - curr.Next = nil + carry = sum / 10 + curr.Next = &ListNode{Val: sum % 10} + curr = curr.Next } return dummy.Next } From e3d897175e124eb1b0c893a1871bf746b5ca00f1 Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 6 Aug 2024 15:25:39 +0900 Subject: [PATCH 180/396] refactor Add Two Numbers --- go/add_two_numbers.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/add_two_numbers.go b/go/add_two_numbers.go index 2bf7f7a..b446c86 100644 --- a/go/add_two_numbers.go +++ b/go/add_two_numbers.go @@ -15,8 +15,8 @@ func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode { sum += l2.Val l2 = l2.Next } - carry = sum / 10 curr.Next = &ListNode{Val: sum % 10} + carry = sum / 10 curr = curr.Next } return dummy.Next From 9580d019c5c4f25257d487d8f3ffd7069b0125df Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 6 Aug 2024 17:23:19 +0900 Subject: [PATCH 181/396] Longest Substring Without Repeating Characters --- ..._substring_without_repeating_characters.go | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 go/longest_substring_without_repeating_characters.go diff --git a/go/longest_substring_without_repeating_characters.go b/go/longest_substring_without_repeating_characters.go new file mode 100644 index 0000000..3135914 --- /dev/null +++ b/go/longest_substring_without_repeating_characters.go @@ -0,0 +1,22 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +func lengthOfLongestSubstring(s string) int { + maxLen := 0 + head := 0 + m := make(map[rune]struct{}) + for tail := 1; tail <= len(s); tail++ { + if _, ok := m[rune(s[tail-1])]; ok { + for s[head] != s[tail-1] { + delete(m, rune(s[head])) + head++ + } + head++ + } else { + m[rune(s[tail-1])] = struct{}{} + } + substring := s[head:tail] + maxLen = max(maxLen, len(substring)) + } + return maxLen +} From cbb66ea403b18b57f405e42ed766b7d85cc9b384 Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 6 Aug 2024 18:22:20 +0900 Subject: [PATCH 182/396] refactor Longest Substring Without Repeating Characters --- ...gest_substring_without_repeating_characters.go | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/go/longest_substring_without_repeating_characters.go b/go/longest_substring_without_repeating_characters.go index 3135914..fc55481 100644 --- a/go/longest_substring_without_repeating_characters.go +++ b/go/longest_substring_without_repeating_characters.go @@ -2,20 +2,21 @@ package main func lengthOfLongestSubstring(s string) int { + runeS := []rune(s) maxLen := 0 head := 0 - m := make(map[rune]struct{}) - for tail := 1; tail <= len(s); tail++ { - if _, ok := m[rune(s[tail-1])]; ok { - for s[head] != s[tail-1] { - delete(m, rune(s[head])) + using := make(map[rune]struct{}) + for tail := 0; tail < len(runeS); tail++ { + if _, ok := using[runeS[tail]]; ok { + for runeS[head] != runeS[tail] { + delete(using, runeS[head]) head++ } head++ } else { - m[rune(s[tail-1])] = struct{}{} + using[runeS[tail]] = struct{}{} } - substring := s[head:tail] + substring := runeS[head : tail+1] maxLen = max(maxLen, len(substring)) } return maxLen From 544e7e977183bf8c7f2c1a65df2532dc0083f291 Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 6 Aug 2024 18:31:12 +0900 Subject: [PATCH 183/396] refactor Longest Substring Without Repeating Characters --- ..._substring_without_repeating_characters.go | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/go/longest_substring_without_repeating_characters.go b/go/longest_substring_without_repeating_characters.go index fc55481..e70426e 100644 --- a/go/longest_substring_without_repeating_characters.go +++ b/go/longest_substring_without_repeating_characters.go @@ -2,22 +2,19 @@ package main func lengthOfLongestSubstring(s string) int { - runeS := []rune(s) - maxLen := 0 - head := 0 - using := make(map[rune]struct{}) - for tail := 0; tail < len(runeS); tail++ { - if _, ok := using[runeS[tail]]; ok { - for runeS[head] != runeS[tail] { - delete(using, runeS[head]) + maxLen, head := 0, 0 + using := make(map[byte]struct{}) + for tail := range s { + if _, ok := using[s[tail]]; ok { + for s[head] != s[tail] { + delete(using, s[head]) head++ } head++ } else { - using[runeS[tail]] = struct{}{} + using[s[tail]] = struct{}{} } - substring := runeS[head : tail+1] - maxLen = max(maxLen, len(substring)) + maxLen = max(maxLen, tail-head+1) } return maxLen } From c8dae290cdd86c51b8e29cb60e0f670241ef8367 Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 6 Aug 2024 18:34:16 +0900 Subject: [PATCH 184/396] refactor Longest Substring Without Repeating Characters --- go/longest_substring_without_repeating_characters.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/go/longest_substring_without_repeating_characters.go b/go/longest_substring_without_repeating_characters.go index e70426e..3b49712 100644 --- a/go/longest_substring_without_repeating_characters.go +++ b/go/longest_substring_without_repeating_characters.go @@ -3,16 +3,16 @@ package main func lengthOfLongestSubstring(s string) int { maxLen, head := 0, 0 - using := make(map[byte]struct{}) + inUse := make(map[byte]struct{}) for tail := range s { - if _, ok := using[s[tail]]; ok { + if _, ok := inUse[s[tail]]; ok { for s[head] != s[tail] { - delete(using, s[head]) + delete(inUse, s[head]) head++ } head++ } else { - using[s[tail]] = struct{}{} + inUse[s[tail]] = struct{}{} } maxLen = max(maxLen, tail-head+1) } From f15ffef3ce31f0f1fd9c16000a21021d7397d0fd Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 6 Aug 2024 18:49:26 +0900 Subject: [PATCH 185/396] refactor Longest Substring Without Repeating Characters --- go/longest_substring_without_repeating_characters.go | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/go/longest_substring_without_repeating_characters.go b/go/longest_substring_without_repeating_characters.go index 3b49712..0c2d68a 100644 --- a/go/longest_substring_without_repeating_characters.go +++ b/go/longest_substring_without_repeating_characters.go @@ -3,17 +3,13 @@ package main func lengthOfLongestSubstring(s string) int { maxLen, head := 0, 0 - inUse := make(map[byte]struct{}) + inUse := make(map[byte]bool) for tail := range s { - if _, ok := inUse[s[tail]]; ok { - for s[head] != s[tail] { - delete(inUse, s[head]) - head++ - } + for inUse[s[tail]] { + delete(inUse, s[head]) head++ - } else { - inUse[s[tail]] = struct{}{} } + inUse[s[tail]] = true maxLen = max(maxLen, tail-head+1) } return maxLen From 65fb184b0dc0460826c85e056f4ed68d08be72ce Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 6 Aug 2024 19:24:30 +0900 Subject: [PATCH 186/396] pullrequests/longest_substring_without_repeating_characters --- .../step1.go | 26 +++++++++++++++++++ .../step2.go | 23 ++++++++++++++++ .../step3.go | 24 +++++++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 pullrequests/longest_substring_without_repeating_characters/step1.go create mode 100644 pullrequests/longest_substring_without_repeating_characters/step2.go create mode 100644 pullrequests/longest_substring_without_repeating_characters/step3.go diff --git a/pullrequests/longest_substring_without_repeating_characters/step1.go b/pullrequests/longest_substring_without_repeating_characters/step1.go new file mode 100644 index 0000000..fe11637 --- /dev/null +++ b/pullrequests/longest_substring_without_repeating_characters/step1.go @@ -0,0 +1,26 @@ +//lint:file-ignore U1000 Ignore all unused code +package longestsubstringwithoutrepeatingcharacters + +/* +時間:34分 +最初に下記のやり方でやることを思いついたが、もう少し賢いやり方があるのではないかと10分ぐらい考えてしまい、思いつかなかったので、とりあえず書こうと思い、書きました。結果的には他の人のコードも見たりする限り、この方法で良かったのだとわかりました。 +*/ +func lengthOfLongestSubstring_step1(s string) int { + maxLen := 0 + head := 0 + m := make(map[rune]struct{}) + for tail := 1; tail <= len(s); tail++ { + if _, ok := m[rune(s[tail-1])]; ok { + for s[head] != s[tail-1] { + delete(m, rune(s[head])) + head++ + } + head++ + } else { + m[rune(s[tail-1])] = struct{}{} + } + substring := s[head:tail] + maxLen = max(maxLen, len(substring)) + } + return maxLen +} diff --git a/pullrequests/longest_substring_without_repeating_characters/step2.go b/pullrequests/longest_substring_without_repeating_characters/step2.go new file mode 100644 index 0000000..3641277 --- /dev/null +++ b/pullrequests/longest_substring_without_repeating_characters/step2.go @@ -0,0 +1,23 @@ +//lint:file-ignore U1000 Ignore all unused code +package longestsubstringwithoutrepeatingcharacters + +/* +より変数名をわかりやすくし、無駄な部分を消しました。 +*/ +func lengthOfLongestSubstring(s string) int { + maxLen, head := 0, 0 + inUse := make(map[byte]struct{}) + for tail := range s { + if _, ok := inUse[s[tail]]; ok { + for s[head] != s[tail] { + delete(inUse, s[head]) + head++ + } + head++ + } else { + inUse[s[tail]] = struct{}{} + } + maxLen = max(maxLen, tail-head+1) + } + return maxLen +} diff --git a/pullrequests/longest_substring_without_repeating_characters/step3.go b/pullrequests/longest_substring_without_repeating_characters/step3.go new file mode 100644 index 0000000..9f7f40f --- /dev/null +++ b/pullrequests/longest_substring_without_repeating_characters/step3.go @@ -0,0 +1,24 @@ +//lint:file-ignore U1000 Ignore all unused code +package longestsubstringwithoutrepeatingcharacters + +/* +inUseの値にbool値を入れればよりシンプルに書けると思ったので、書き換えました。 + + - inUseの値に最後に見たインデックスを入れることも考えたが、どちらにせよ`delete(inUse, s[head])`でそこまでの文字を消していく必要があるので、意味がないのでは? + - head, tailか、left, rightのどちらの方がベターか。substringの先頭・末尾と捉えるのであれば前者、Two Pointersと捉えるのであれば後者?head, tailの方がinclusiveだとわかるのでより良いのでは?(https://github.com/sakzk/leetcode/pull/3#discussion_r1591191532) + - inUseという変数名はどうか? + ー 確かにsliding windowと捉えることもできる(https://github.com/sakzk/leetcode/pull/3#discussion_r1591194013) +*/ +func lengthOfLongestSubstring_step3(s string) int { + maxLen, head := 0, 0 + inUse := make(map[byte]bool) + for tail := range s { + for inUse[s[tail]] { + delete(inUse, s[head]) + head++ + } + inUse[s[tail]] = true + maxLen = max(maxLen, tail-head+1) + } + return maxLen +} From 3709708d0432be5ba6bfec588c85241854bca153 Mon Sep 17 00:00:00 2001 From: rihib Date: Wed, 7 Aug 2024 01:09:15 +0900 Subject: [PATCH 187/396] refactor Two Sum --- go/two_sum.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/go/two_sum.go b/go/two_sum.go index 67d45f7..cb74e39 100644 --- a/go/two_sum.go +++ b/go/two_sum.go @@ -2,12 +2,12 @@ package main func twoSum(nums []int, target int) []int { - m := make(map[int]int) + numsMap := make(map[int]int) for i, n := range nums { - if j, ok := m[target-n]; ok { + if j, ok := numsMap[target-n]; ok { return []int{i, j} } - m[n] = i + numsMap[n] = i } return nil } From 08581026a58ad9939d4d5a4a4b989f2d7bd28af3 Mon Sep 17 00:00:00 2001 From: rihib Date: Wed, 7 Aug 2024 01:47:19 +0900 Subject: [PATCH 188/396] 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 d609542da07851e555b62eb7051daf84094124bc Mon Sep 17 00:00:00 2001 From: rihib Date: Wed, 7 Aug 2024 12:35:14 +0900 Subject: [PATCH 189/396] Zigzag Conversion --- go/zigzag_conversion.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 go/zigzag_conversion.go diff --git a/go/zigzag_conversion.go b/go/zigzag_conversion.go new file mode 100644 index 0000000..973b491 --- /dev/null +++ b/go/zigzag_conversion.go @@ -0,0 +1,22 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +func convert(s string, numRows int) string { + if numRows == 1 { + return s + } + var rows = make([][]rune, numRows) + for i, r := range s { + tmp := i % (numRows*2 - 2) + if tmp < numRows { + rows[tmp] = append(rows[tmp], r) + } else { + rows[2*numRows-tmp-2] = append(rows[2*numRows-tmp-2], r) + } + } + var res []rune + for _, row := range rows { + res = append(res, row...) + } + return string(res) +} From 426b28110cc4b77f707937e264474eb17358cf51 Mon Sep 17 00:00:00 2001 From: rihib Date: Wed, 7 Aug 2024 12:54:23 +0900 Subject: [PATCH 190/396] refactor Zigzag Conversion --- go/zigzag_conversion.go | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/go/zigzag_conversion.go b/go/zigzag_conversion.go index 973b491..f71079d 100644 --- a/go/zigzag_conversion.go +++ b/go/zigzag_conversion.go @@ -5,18 +5,22 @@ func convert(s string, numRows int) string { if numRows == 1 { return s } - var rows = make([][]rune, numRows) + + rows := make([][]rune, numRows) for i, r := range s { - tmp := i % (numRows*2 - 2) - if tmp < numRows { - rows[tmp] = append(rows[tmp], r) + offset := i % (numRows*2 - 2) + var rowNum int + if offset < numRows { + rowNum = offset } else { - rows[2*numRows-tmp-2] = append(rows[2*numRows-tmp-2], r) + rowNum = 2*numRows - offset - 2 } + rows[rowNum] = append(rows[rowNum], r) } - var res []rune + + var oneline []rune for _, row := range rows { - res = append(res, row...) + oneline = append(oneline, row...) } - return string(res) + return string(oneline) } From 0ed47578595a65ec698c2429ec2bb33af6eb0813 Mon Sep 17 00:00:00 2001 From: rihib Date: Wed, 7 Aug 2024 12:58:43 +0900 Subject: [PATCH 191/396] refactor Zigzag Conversion --- go/zigzag_conversion.go | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/go/zigzag_conversion.go b/go/zigzag_conversion.go index f71079d..ec12e86 100644 --- a/go/zigzag_conversion.go +++ b/go/zigzag_conversion.go @@ -7,13 +7,11 @@ func convert(s string, numRows int) string { } rows := make([][]rune, numRows) + cycleLen := 2*numRows - 2 for i, r := range s { - offset := i % (numRows*2 - 2) - var rowNum int - if offset < numRows { - rowNum = offset - } else { - rowNum = 2*numRows - offset - 2 + rowNum := i % cycleLen + if rowNum >= numRows { + rowNum = cycleLen - rowNum } rows[rowNum] = append(rows[rowNum], r) } From e651d20d2794ccf8eaad0f64144ee568184a37fc Mon Sep 17 00:00:00 2001 From: rihib Date: Wed, 7 Aug 2024 13:06:17 +0900 Subject: [PATCH 192/396] refactor Zigzag Conversion --- go/zigzag_conversion.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/go/zigzag_conversion.go b/go/zigzag_conversion.go index ec12e86..1909b7a 100644 --- a/go/zigzag_conversion.go +++ b/go/zigzag_conversion.go @@ -1,24 +1,26 @@ //lint:file-ignore U1000 Ignore all unused code package main +import "strings" + func convert(s string, numRows int) string { if numRows == 1 { return s } - rows := make([][]rune, numRows) + rows := make([]strings.Builder, numRows) cycleLen := 2*numRows - 2 for i, r := range s { rowNum := i % cycleLen if rowNum >= numRows { rowNum = cycleLen - rowNum } - rows[rowNum] = append(rows[rowNum], r) + rows[rowNum].WriteRune(r) } - var oneline []rune + var oneline strings.Builder for _, row := range rows { - oneline = append(oneline, row...) + oneline.WriteString(row.String()) } - return string(oneline) + return oneline.String() } From 26835a25cb8b040d49a617694204ba064dcd670a Mon Sep 17 00:00:00 2001 From: rihib Date: Wed, 7 Aug 2024 14:07:41 +0900 Subject: [PATCH 193/396] another solution for Zigzag Conversion --- go/zigzag_conversion.go | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/go/zigzag_conversion.go b/go/zigzag_conversion.go index 1909b7a..5bc6bbc 100644 --- a/go/zigzag_conversion.go +++ b/go/zigzag_conversion.go @@ -24,3 +24,23 @@ func convert(s string, numRows int) string { } return oneline.String() } + +func convert_anothersolution(s string, numRows int) string { + if numRows == 1 { + return s + } + var oneline strings.Builder + cycleLen := 2*numRows - 2 + for rowNum := 0; rowNum < numRows; rowNum++ { + for i := rowNum; i < len(s); i += cycleLen { + oneline.WriteByte(s[i]) + if 0 < rowNum && rowNum < numRows-1 { + diagIdx := i + cycleLen - rowNum*2 + if diagIdx < len(s) { + oneline.WriteByte(s[diagIdx]) + } + } + } + } + return oneline.String() +} From ce21b0323478cb19ebf4c98b6ff3ec6470299734 Mon Sep 17 00:00:00 2001 From: rihib Date: Wed, 7 Aug 2024 14:46:40 +0900 Subject: [PATCH 194/396] pullrequests/zigzag_conversion --- pullrequests/zigzag_conversion/step1.go | 27 +++++++++++++ pullrequests/zigzag_conversion/step2.go | 27 +++++++++++++ pullrequests/zigzag_conversion/step3.go | 50 +++++++++++++++++++++++++ 3 files changed, 104 insertions(+) create mode 100644 pullrequests/zigzag_conversion/step1.go create mode 100644 pullrequests/zigzag_conversion/step2.go create mode 100644 pullrequests/zigzag_conversion/step3.go diff --git a/pullrequests/zigzag_conversion/step1.go b/pullrequests/zigzag_conversion/step1.go new file mode 100644 index 0000000..4888418 --- /dev/null +++ b/pullrequests/zigzag_conversion/step1.go @@ -0,0 +1,27 @@ +//lint:file-ignore U1000 Ignore all unused code +package zigzagconversion + +/* +時間:34分 +解法を思いつくのに時間がかかってしまいました(10分ぐらい?)。 +規則性を持っており、インデックスからどの行になるかを求めることができると思ったのでこの解法になりました。 +*/ +func convert_step1(s string, numRows int) string { + if numRows == 1 { + return s + } + var rows = make([][]rune, numRows) + for i, r := range s { + tmp := i % (numRows*2 - 2) + if tmp < numRows { + rows[tmp] = append(rows[tmp], r) + } else { + rows[2*numRows-tmp-2] = append(rows[2*numRows-tmp-2], r) + } + } + var res []rune + for _, row := range rows { + res = append(res, row...) + } + return string(res) +} diff --git a/pullrequests/zigzag_conversion/step2.go b/pullrequests/zigzag_conversion/step2.go new file mode 100644 index 0000000..7a8bc45 --- /dev/null +++ b/pullrequests/zigzag_conversion/step2.go @@ -0,0 +1,27 @@ +//lint:file-ignore U1000 Ignore all unused code +package zigzagconversion + +/* +より読みやすくなるようにリファクタしました。 +*/ +func convert_step2(s string, numRows int) string { + if numRows == 1 { + return s + } + + rows := make([][]rune, numRows) + cycleLen := 2*numRows - 2 + for i, r := range s { + rowNum := i % cycleLen + if rowNum >= numRows { + rowNum = cycleLen - rowNum + } + rows[rowNum] = append(rows[rowNum], r) + } + + var oneline []rune + for _, row := range rows { + oneline = append(oneline, row...) + } + return string(oneline) +} diff --git a/pullrequests/zigzag_conversion/step3.go b/pullrequests/zigzag_conversion/step3.go new file mode 100644 index 0000000..34152a3 --- /dev/null +++ b/pullrequests/zigzag_conversion/step3.go @@ -0,0 +1,50 @@ +//lint:file-ignore U1000 Ignore all unused code +package zigzagconversion + +import "strings" + +/* +文字列結合のパフォーマンスが良くなるように変更しました。 +また、空間計算量がO(1)になる解法も追加しました。 +*/ +func convert_step3(s string, numRows int) string { + if numRows == 1 { + return s + } + + rows := make([]strings.Builder, numRows) + cycleLen := 2*numRows - 2 + for i, r := range s { + rowNum := i % cycleLen + if rowNum >= numRows { + rowNum = cycleLen - rowNum + } + rows[rowNum].WriteRune(r) + } + + var oneline strings.Builder + for _, row := range rows { + oneline.WriteString(row.String()) + } + return oneline.String() +} + +func convert_step3_anothersolution(s string, numRows int) string { + if numRows == 1 { + return s + } + var oneline strings.Builder + cycleLen := 2*numRows - 2 + for rowNum := 0; rowNum < numRows; rowNum++ { + for i := rowNum; i < len(s); i += cycleLen { + oneline.WriteByte(s[i]) + if 0 < rowNum && rowNum < numRows-1 { + diagIdx := i + cycleLen - rowNum*2 + if diagIdx < len(s) { + oneline.WriteByte(s[diagIdx]) + } + } + } + } + return oneline.String() +} From e69ccc8468f3b84bf4d8afdd9f64f93ce327e2a1 Mon Sep 17 00:00:00 2001 From: rihib Date: Wed, 7 Aug 2024 17:23:55 +0900 Subject: [PATCH 195/396] String to Integer (atoi) --- go/string_to_integer_atoi.go | 37 ++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 go/string_to_integer_atoi.go diff --git a/go/string_to_integer_atoi.go b/go/string_to_integer_atoi.go new file mode 100644 index 0000000..fbaf5d7 --- /dev/null +++ b/go/string_to_integer_atoi.go @@ -0,0 +1,37 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +import "math" + +func myAtoi(s string) int { + const ( + intMax = int(math.MaxInt32) + intMin = int(math.MinInt32) + ) + + i := 0 + for i < len(s) && s[i] == ' ' { + i++ + } + + sign := 0 + if i < len(s) && (s[i] == '-' || s[i] == '+') { + if s[i] == '-' { + sign = -1 + } + i++ + } + + num := 0 + for i < len(s) && '0' <= s[i] && s[i] <= '9' { + num = num*10 + int(s[i]-'0') + if sign == 1 && num > intMax { + return intMax + } + if sign == -1 && -num < intMin { + return intMin + } + i++ + } + return sign * num +} From 08331f21e03f62d815c354908e65d0607cb8efb0 Mon Sep 17 00:00:00 2001 From: rihib Date: Wed, 7 Aug 2024 17:49:58 +0900 Subject: [PATCH 196/396] fix typo --- go/string_to_integer_atoi.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/string_to_integer_atoi.go b/go/string_to_integer_atoi.go index fbaf5d7..e938846 100644 --- a/go/string_to_integer_atoi.go +++ b/go/string_to_integer_atoi.go @@ -14,7 +14,7 @@ func myAtoi(s string) int { i++ } - sign := 0 + sign := -1 if i < len(s) && (s[i] == '-' || s[i] == '+') { if s[i] == '-' { sign = -1 From e3827be658c8c8de93c20b55e37d5769bd865120 Mon Sep 17 00:00:00 2001 From: rihib Date: Wed, 7 Aug 2024 17:50:54 +0900 Subject: [PATCH 197/396] fix typo --- go/string_to_integer_atoi.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/string_to_integer_atoi.go b/go/string_to_integer_atoi.go index e938846..5d674b8 100644 --- a/go/string_to_integer_atoi.go +++ b/go/string_to_integer_atoi.go @@ -14,7 +14,7 @@ func myAtoi(s string) int { i++ } - sign := -1 + sign := 1 if i < len(s) && (s[i] == '-' || s[i] == '+') { if s[i] == '-' { sign = -1 From c4838a9ad21f26c5008a4bd3bbf06763e7975372 Mon Sep 17 00:00:00 2001 From: rihib Date: Wed, 7 Aug 2024 17:53:03 +0900 Subject: [PATCH 198/396] refactor String to Integer (atoi) --- go/string_to_integer_atoi.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/go/string_to_integer_atoi.go b/go/string_to_integer_atoi.go index 5d674b8..b6bbbe9 100644 --- a/go/string_to_integer_atoi.go +++ b/go/string_to_integer_atoi.go @@ -24,13 +24,14 @@ func myAtoi(s string) int { num := 0 for i < len(s) && '0' <= s[i] && s[i] <= '9' { - num = num*10 + int(s[i]-'0') - if sign == 1 && num > intMax { + next := int(s[i] - '0') + if sign != -1 && num > (intMax-next)/10 { return intMax } - if sign == -1 && -num < intMin { + if sign == -1 && -num < (intMin+next)/10 { return intMin } + num = num*10 + next i++ } return sign * num From b85b250dfa4f51e7b45f15b9f4f0c6a5d012f151 Mon Sep 17 00:00:00 2001 From: rihib Date: Wed, 7 Aug 2024 18:10:45 +0900 Subject: [PATCH 199/396] pullrequests/string_to_integer_atoi --- pullrequests/string_to_integer_atoi/step1.go | 41 ++++++++++++++++++++ pullrequests/string_to_integer_atoi/step2.go | 40 +++++++++++++++++++ pullrequests/string_to_integer_atoi/step3.go | 40 +++++++++++++++++++ 3 files changed, 121 insertions(+) create mode 100644 pullrequests/string_to_integer_atoi/step1.go create mode 100644 pullrequests/string_to_integer_atoi/step2.go create mode 100644 pullrequests/string_to_integer_atoi/step3.go diff --git a/pullrequests/string_to_integer_atoi/step1.go b/pullrequests/string_to_integer_atoi/step1.go new file mode 100644 index 0000000..5aeee4a --- /dev/null +++ b/pullrequests/string_to_integer_atoi/step1.go @@ -0,0 +1,41 @@ +//lint:file-ignore U1000 Ignore all unused code +package stringtointegeratoi + +import "math" + +/* +時間:20分 +解法自体はすぐに思いついたのですが、色々とバグを取り除くのに時間がかかってしまいました。 +*/ +func myAtoi_step1(s string) int { + const ( + intMax = int(math.MaxInt32) + intMin = int(math.MinInt32) + ) + sign := 1 + i := 0 + num := 0 + for i < len(s) && s[i] == ' ' { + i++ + } + if i < len(s) && (s[i] == '-' || s[i] == '+') { + if s[i] == '-' { + sign = -1 + } + i++ + } + for i < len(s) && s[i] == '0' { + i++ + } + for i < len(s) && '0' <= rune(s[i]) && rune(s[i]) <= '9' { + num = num*10 + int(rune(s[i])-'0') + if sign == 1 && num > intMax { + return intMax + } + if sign == -1 && -num < intMin { + return intMin + } + i++ + } + return num * sign +} diff --git a/pullrequests/string_to_integer_atoi/step2.go b/pullrequests/string_to_integer_atoi/step2.go new file mode 100644 index 0000000..73bc1fe --- /dev/null +++ b/pullrequests/string_to_integer_atoi/step2.go @@ -0,0 +1,40 @@ +//lint:file-ignore U1000 Ignore all unused code +package stringtointegeratoi + +import "math" + +/* +Goではrune型はint32、byte型はint8のエイリアスで、明示的にキャストしなくても内部でキャストしてくれるので、そのまま比較できるため、rune型にキャストするのをやめました。 +*/ +func myAtoi_step2(s string) int { + const ( + intMax = int(math.MaxInt32) + intMin = int(math.MinInt32) + ) + + i := 0 + for i < len(s) && s[i] == ' ' { + i++ + } + + sign := 1 + if i < len(s) && (s[i] == '-' || s[i] == '+') { + if s[i] == '-' { + sign = -1 + } + i++ + } + + num := 0 + for i < len(s) && '0' <= s[i] && s[i] <= '9' { + num = num*10 + int(s[i]-'0') + if sign == 1 && num > intMax { + return intMax + } + if sign == -1 && -num < intMin { + return intMin + } + i++ + } + return sign * num +} diff --git a/pullrequests/string_to_integer_atoi/step3.go b/pullrequests/string_to_integer_atoi/step3.go new file mode 100644 index 0000000..1eaf703 --- /dev/null +++ b/pullrequests/string_to_integer_atoi/step3.go @@ -0,0 +1,40 @@ +//lint:file-ignore U1000 Ignore all unused code +package stringtointegeratoi + +import "math" + +/* +32bit環境でもオーバーフローしないようにコードを変えてみました。 +*/ +func myAtoi(s string) int { + const ( + intMax = int(math.MaxInt32) + intMin = int(math.MinInt32) + ) + + i := 0 + for i < len(s) && s[i] == ' ' { + i++ + } + + sign := 0 + if i < len(s) && (s[i] == '-' || s[i] == '+') { + if s[i] == '-' { + sign = -1 + } + i++ + } + + num := 0 + for i < len(s) && '0' <= s[i] && s[i] <= '9' { + num = num*10 + int(s[i]-'0') + if sign == 1 && num > intMax { + return intMax + } + if sign == -1 && -num < intMin { + return intMin + } + i++ + } + return sign * num +} From 4a5854832948376b7131f30965a224c5458c4906 Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 8 Aug 2024 15:40:54 +0900 Subject: [PATCH 200/396] fix typo --- pullrequests/string_to_integer_atoi/step3.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pullrequests/string_to_integer_atoi/step3.go b/pullrequests/string_to_integer_atoi/step3.go index 1eaf703..a34066a 100644 --- a/pullrequests/string_to_integer_atoi/step3.go +++ b/pullrequests/string_to_integer_atoi/step3.go @@ -17,7 +17,7 @@ func myAtoi(s string) int { i++ } - sign := 0 + sign := 1 if i < len(s) && (s[i] == '-' || s[i] == '+') { if s[i] == '-' { sign = -1 @@ -27,13 +27,14 @@ func myAtoi(s string) int { num := 0 for i < len(s) && '0' <= s[i] && s[i] <= '9' { - num = num*10 + int(s[i]-'0') - if sign == 1 && num > intMax { + next := int(s[i] - '0') + if sign != -1 && num > (intMax-next)/10 { return intMax } - if sign == -1 && -num < intMin { + if sign == -1 && -num < (intMin+next)/10 { return intMin } + num = num*10 + next i++ } return sign * num From a02a219e418e382bb3292966f5b88b66fd7609c3 Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 8 Aug 2024 21:53:49 +0900 Subject: [PATCH 201/396] Generate Parentheses --- go/generate_parentheses.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 go/generate_parentheses.go diff --git a/go/generate_parentheses.go b/go/generate_parentheses.go new file mode 100644 index 0000000..da85fde --- /dev/null +++ b/go/generate_parentheses.go @@ -0,0 +1,26 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +func generateParenthesis(n int) []string { + var parentheses []string + var stack []byte + var backtrack func(int, int) + backtrack = func(open int, closed int) { + if open == n && closed == n { + parentheses = append(parentheses, string(stack)) + return + } + if open < n { + stack = append(stack, '(') + backtrack(open+1, closed) + stack = stack[:len(stack)-1] + } + if closed < open { + stack = append(stack, ')') + backtrack(open, closed+1) + stack = stack[:len(stack)-1] + } + } + backtrack(0, 0) + return parentheses +} From e0bdcf08fc8fdf06b1989f088eca4776fc444974 Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 8 Aug 2024 22:01:12 +0900 Subject: [PATCH 202/396] refactor Generate Parentheses --- go/generate_parentheses.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/generate_parentheses.go b/go/generate_parentheses.go index da85fde..9af9561 100644 --- a/go/generate_parentheses.go +++ b/go/generate_parentheses.go @@ -15,7 +15,7 @@ func generateParenthesis(n int) []string { backtrack(open+1, closed) stack = stack[:len(stack)-1] } - if closed < open { + if open > closed { stack = append(stack, ')') backtrack(open, closed+1) stack = stack[:len(stack)-1] From 27d422c1e8e684091717b68a7ef6cca1d7b1735a Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 8 Aug 2024 22:40:35 +0900 Subject: [PATCH 203/396] refactor Generate Parentheses --- go/generate_parentheses.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/go/generate_parentheses.go b/go/generate_parentheses.go index 9af9561..834cace 100644 --- a/go/generate_parentheses.go +++ b/go/generate_parentheses.go @@ -4,23 +4,23 @@ package main func generateParenthesis(n int) []string { var parentheses []string var stack []byte - var backtrack func(int, int) - backtrack = func(open int, closed int) { + var generate func(int, int) + generate = func(open int, closed int) { if open == n && closed == n { parentheses = append(parentheses, string(stack)) return } if open < n { stack = append(stack, '(') - backtrack(open+1, closed) + generate(open+1, closed) stack = stack[:len(stack)-1] } if open > closed { stack = append(stack, ')') - backtrack(open, closed+1) + generate(open, closed+1) stack = stack[:len(stack)-1] } } - backtrack(0, 0) + generate(0, 0) return parentheses } From e3d7414aaac8469b7331cba95a251b0c945b0c13 Mon Sep 17 00:00:00 2001 From: rihib Date: Fri, 9 Aug 2024 00:48:33 +0900 Subject: [PATCH 204/396] Next Permutation --- go/next_permutation.go | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 go/next_permutation.go diff --git a/go/next_permutation.go b/go/next_permutation.go new file mode 100644 index 0000000..98a33d0 --- /dev/null +++ b/go/next_permutation.go @@ -0,0 +1,27 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +import "sort" + +func nextPermutation(nums []int) { + for i := len(nums) - 1; i > 0; i-- { + if nums[i-1] < nums[i] { + minN := nums[i] + idx := i + for j := i; j < len(nums); j++ { + if nums[j] < minN && nums[i-1] < nums[j] { + idx = j + minN = nums[j] + } + } + nums[i-1], nums[idx] = nums[idx], nums[i-1] + sort.Slice(nums[i:], func(a, b int) bool { + return nums[i+a] < nums[i+b] + }) + return + } + } + sort.Slice(nums, func(a, b int) bool { + return nums[a] < nums[b] + }) +} From 1364d91b96070a3fcabf9788ce18d76141048024 Mon Sep 17 00:00:00 2001 From: rihib Date: Fri, 9 Aug 2024 00:59:17 +0900 Subject: [PATCH 205/396] refactor Next Permutation --- go/next_permutation.go | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/go/next_permutation.go b/go/next_permutation.go index 98a33d0..5de0873 100644 --- a/go/next_permutation.go +++ b/go/next_permutation.go @@ -6,15 +6,13 @@ import "sort" func nextPermutation(nums []int) { for i := len(nums) - 1; i > 0; i-- { if nums[i-1] < nums[i] { - minN := nums[i] - idx := i + candidate, candidateIndex := nums[i], i for j := i; j < len(nums); j++ { - if nums[j] < minN && nums[i-1] < nums[j] { - idx = j - minN = nums[j] + if nums[j] < candidate && nums[i-1] < nums[j] { + candidate, candidateIndex = nums[j], j } } - nums[i-1], nums[idx] = nums[idx], nums[i-1] + nums[i-1], nums[candidateIndex] = nums[candidateIndex], nums[i-1] sort.Slice(nums[i:], func(a, b int) bool { return nums[i+a] < nums[i+b] }) From 717004159d51c746230c3deb9c1b7bc0ee2e02a3 Mon Sep 17 00:00:00 2001 From: rihib Date: Fri, 9 Aug 2024 02:43:33 +0900 Subject: [PATCH 206/396] refactor Next Permutation --- go/next_permutation.go | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/go/next_permutation.go b/go/next_permutation.go index 5de0873..cd62551 100644 --- a/go/next_permutation.go +++ b/go/next_permutation.go @@ -1,25 +1,26 @@ //lint:file-ignore U1000 Ignore all unused code package main -import "sort" - func nextPermutation(nums []int) { - for i := len(nums) - 1; i > 0; i-- { - if nums[i-1] < nums[i] { - candidate, candidateIndex := nums[i], i - for j := i; j < len(nums); j++ { - if nums[j] < candidate && nums[i-1] < nums[j] { - candidate, candidateIndex = nums[j], j - } - } - nums[i-1], nums[candidateIndex] = nums[candidateIndex], nums[i-1] - sort.Slice(nums[i:], func(a, b int) bool { - return nums[i+a] < nums[i+b] - }) - return + if len(nums) < 2 { + return + } + i := len(nums) - 2 + for i >= 0 && nums[i] >= nums[i+1] { + i-- + } + if i >= 0 { + j := len(nums) - 1 + for nums[j] <= nums[i] { + j-- } + nums[i], nums[j] = nums[j], nums[i] + } + reverse(nums[i+1:]) +} + +func reverse(nums []int) { + for i, j := 0, len(nums)-1; i < j; i, j = i+1, j-1 { + nums[i], nums[j] = nums[j], nums[i] } - sort.Slice(nums, func(a, b int) bool { - return nums[a] < nums[b] - }) } From add3803b948a64a6de19de78b6c134cbcf577373 Mon Sep 17 00:00:00 2001 From: rihib Date: Fri, 9 Aug 2024 15:44:36 +0900 Subject: [PATCH 207/396] fix String to Integer (atoi) --- go/string_to_integer_atoi.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/go/string_to_integer_atoi.go b/go/string_to_integer_atoi.go index b6bbbe9..0151174 100644 --- a/go/string_to_integer_atoi.go +++ b/go/string_to_integer_atoi.go @@ -24,14 +24,14 @@ func myAtoi(s string) int { num := 0 for i < len(s) && '0' <= s[i] && s[i] <= '9' { - next := int(s[i] - '0') - if sign != -1 && num > (intMax-next)/10 { + digit := int(s[i] - '0') + if sign == 1 && (num > intMax/10 || num == intMax/10 && digit >= intMax%10) { return intMax } - if sign == -1 && -num < (intMin+next)/10 { + if sign == -1 && (-num < intMin/10 || -num == intMin/10 && -digit <= intMin%10) { return intMin } - num = num*10 + next + num = num*10 + digit i++ } return sign * num From 043d41c78c0730128b315d6e30debc4c8671f7b0 Mon Sep 17 00:00:00 2001 From: rihib Date: Fri, 9 Aug 2024 15:47:30 +0900 Subject: [PATCH 208/396] add step4 pullrequests/string_to_integer_atoi --- pullrequests/string_to_integer_atoi/step4.go | 41 ++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 pullrequests/string_to_integer_atoi/step4.go diff --git a/pullrequests/string_to_integer_atoi/step4.go b/pullrequests/string_to_integer_atoi/step4.go new file mode 100644 index 0000000..74aa35c --- /dev/null +++ b/pullrequests/string_to_integer_atoi/step4.go @@ -0,0 +1,41 @@ +//lint:file-ignore U1000 Ignore all unused code +package stringtointegeratoi + +import "math" + +/* +Step3のオーバーフローしてしまうバグを直しました。 +*/ +func myAtoi_step4(s string) int { + const ( + intMax = int(math.MaxInt32) + intMin = int(math.MinInt32) + ) + + i := 0 + for i < len(s) && s[i] == ' ' { + i++ + } + + sign := 1 + if i < len(s) && (s[i] == '-' || s[i] == '+') { + if s[i] == '-' { + sign = -1 + } + i++ + } + + num := 0 + for i < len(s) && '0' <= s[i] && s[i] <= '9' { + digit := int(s[i] - '0') + if sign == 1 && (num > intMax/10 || num == intMax/10 && digit >= intMax%10) { + return intMax + } + if sign == -1 && (-num < intMin/10 || -num == intMin/10 && -digit <= intMin%10) { + return intMin + } + num = num*10 + digit + i++ + } + return sign * num +} From 119af5e281dfeddff54d569e218e969df324b5d3 Mon Sep 17 00:00:00 2001 From: rihib Date: Fri, 9 Aug 2024 16:04:15 +0900 Subject: [PATCH 209/396] add comment --- go/linked_list_cycle.go | 1 + 1 file changed, 1 insertion(+) diff --git a/go/linked_list_cycle.go b/go/linked_list_cycle.go index 0408ae6..bb9cf4e 100644 --- a/go/linked_list_cycle.go +++ b/go/linked_list_cycle.go @@ -1,6 +1,7 @@ //lint:file-ignore U1000 Ignore all unused code package main +// `https://github.com/ryo-devz/LeetCode/pull/1#discussion_r1710718113`に書かれているとおり、印をつける方法はデメリットが大きい func hasCycle(head *ListNode) bool { fast, slow := head, head for fast != nil && fast.Next != nil { From 9667dcc58b24ff0ef80aadcb7a75e2bdae2bd689 Mon Sep 17 00:00:00 2001 From: rihib Date: Fri, 9 Aug 2024 18:17:25 +0900 Subject: [PATCH 210/396] Search in Rotated Sorted Array --- go/search_in_rotated_sorted_array.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 go/search_in_rotated_sorted_array.go diff --git a/go/search_in_rotated_sorted_array.go b/go/search_in_rotated_sorted_array.go new file mode 100644 index 0000000..eb9e567 --- /dev/null +++ b/go/search_in_rotated_sorted_array.go @@ -0,0 +1,26 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +func searchInRotatedSortedArray(nums []int, target int) int { + left, right := 0, len(nums)-1 + for left <= right { + mid := (left + right) / 2 + if target == nums[mid] { + return mid + } + if nums[left] <= nums[mid] { + if nums[left] <= target && target < nums[mid] { + right = mid - 1 + } else { + left = mid + 1 + } + } else { + if nums[mid] < target && target <= nums[right] { + left = mid + 1 + } else { + right = mid - 1 + } + } + } + return -1 +} From 0136d917aa96d095e92b104cdcc223d05c1aecc4 Mon Sep 17 00:00:00 2001 From: rihib Date: Fri, 9 Aug 2024 18:47:33 +0900 Subject: [PATCH 211/396] another solution for Search in Rotated Sorted Array --- go/search_in_rotated_sorted_array.go | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/go/search_in_rotated_sorted_array.go b/go/search_in_rotated_sorted_array.go index eb9e567..d6d31ac 100644 --- a/go/search_in_rotated_sorted_array.go +++ b/go/search_in_rotated_sorted_array.go @@ -1,7 +1,7 @@ //lint:file-ignore U1000 Ignore all unused code package main -func searchInRotatedSortedArray(nums []int, target int) int { +func search_closed(nums []int, target int) int { left, right := 0, len(nums)-1 for left <= right { mid := (left + right) / 2 @@ -24,3 +24,27 @@ func searchInRotatedSortedArray(nums []int, target int) int { } return -1 } + +func search_half_closed(nums []int, target int) int { + left, right := 0, len(nums) + for left < right { + mid := (left + right) / 2 + if target == nums[mid] { + return mid + } + if nums[left] <= nums[mid] { + if nums[left] <= target && target < nums[mid] { + right = mid + } else { + left = mid + 1 + } + } else { + if nums[mid] < target && target <= nums[right-1] { + left = mid + 1 + } else { + right = mid + } + } + } + return -1 +} From 5fcd1ba1ddf95d16be7306a9654187efdd958f4d Mon Sep 17 00:00:00 2001 From: rihib Date: Fri, 9 Aug 2024 22:00:20 +0900 Subject: [PATCH 212/396] Search Insert Position --- go/search_insert_position.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 go/search_insert_position.go diff --git a/go/search_insert_position.go b/go/search_insert_position.go new file mode 100644 index 0000000..03ff035 --- /dev/null +++ b/go/search_insert_position.go @@ -0,0 +1,22 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +func searchInsert(nums []int, target int) int { + left, right := 0, len(nums) + var mid int + for left < right { + mid = (left + right) / 2 + if target == nums[mid] { + return mid + } + if target < nums[mid] { + right = mid + } else { + left = mid + 1 + } + } + if target < nums[mid] { + return mid + } + return mid + 1 +} From f02485973356720fd8fbc95e3d273bd1a24d5472 Mon Sep 17 00:00:00 2001 From: rihib Date: Fri, 9 Aug 2024 22:14:46 +0900 Subject: [PATCH 213/396] refactor Search Insert Position --- go/search_insert_position.go | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/go/search_insert_position.go b/go/search_insert_position.go index 03ff035..a02d9be 100644 --- a/go/search_insert_position.go +++ b/go/search_insert_position.go @@ -3,20 +3,16 @@ package main func searchInsert(nums []int, target int) int { left, right := 0, len(nums) - var mid int for left < right { - mid = (left + right) / 2 - if target == nums[mid] { + mid := (left + right) / 2 + if nums[mid] == target { return mid } - if target < nums[mid] { - right = mid - } else { + if nums[mid] < target { left = mid + 1 + } else { + right = mid } } - if target < nums[mid] { - return mid - } - return mid + 1 + return left } From c5f0404f086b84c11c706818a91150fcf58f97a0 Mon Sep 17 00:00:00 2001 From: rihib Date: Fri, 9 Aug 2024 22:29:33 +0900 Subject: [PATCH 214/396] refactor Search Insert Position --- go/search_insert_position.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/search_insert_position.go b/go/search_insert_position.go index a02d9be..149acd3 100644 --- a/go/search_insert_position.go +++ b/go/search_insert_position.go @@ -4,7 +4,7 @@ package main func searchInsert(nums []int, target int) int { left, right := 0, len(nums) for left < right { - mid := (left + right) / 2 + mid := left + (right-left)/2 if nums[mid] == target { return mid } From 0d7c2ed1d9bbe45dffa270584c83b741f3e19791 Mon Sep 17 00:00:00 2001 From: rihib Date: Fri, 9 Aug 2024 22:41:39 +0900 Subject: [PATCH 215/396] pullrequests/search_insert_position --- pullrequests/search_insert_position/step1.go | 27 ++++++++++++++++++++ pullrequests/search_insert_position/step2.go | 22 ++++++++++++++++ pullrequests/search_insert_position/step3.go | 22 ++++++++++++++++ 3 files changed, 71 insertions(+) create mode 100644 pullrequests/search_insert_position/step1.go create mode 100644 pullrequests/search_insert_position/step2.go create mode 100644 pullrequests/search_insert_position/step3.go diff --git a/pullrequests/search_insert_position/step1.go b/pullrequests/search_insert_position/step1.go new file mode 100644 index 0000000..f500b57 --- /dev/null +++ b/pullrequests/search_insert_position/step1.go @@ -0,0 +1,27 @@ +//lint:file-ignore U1000 Ignore all unused code +package searchinsertposition + +/* +時間:12分 +解法自体はすぐに浮かんで解くことができた。 +その割に二分探索を書くのがまだ慣れていなくて少し時間がかかってしまった。 +*/ +func searchInsert_step1(nums []int, target int) int { + left, right := 0, len(nums) + var mid int + for left < right { + mid = (left + right) / 2 + if target == nums[mid] { + return mid + } + if target < nums[mid] { + right = mid + } else { + left = mid + 1 + } + } + if target < nums[mid] { + return mid + } + return mid + 1 +} diff --git a/pullrequests/search_insert_position/step2.go b/pullrequests/search_insert_position/step2.go new file mode 100644 index 0000000..63236c2 --- /dev/null +++ b/pullrequests/search_insert_position/step2.go @@ -0,0 +1,22 @@ +//lint:file-ignore U1000 Ignore all unused code +package searchinsertposition + +/* +最後の部分はleftを返せ馬良いと気づき変更した。 +その他もより読みやすいように直した。 +*/ +func searchInsert_step2(nums []int, target int) int { + left, right := 0, len(nums) + for left < right { + mid := (left + right) / 2 + if nums[mid] == target { + return mid + } + if nums[mid] < target { + left = mid + 1 + } else { + right = mid + } + } + return left +} diff --git a/pullrequests/search_insert_position/step3.go b/pullrequests/search_insert_position/step3.go new file mode 100644 index 0000000..86f7164 --- /dev/null +++ b/pullrequests/search_insert_position/step3.go @@ -0,0 +1,22 @@ +//lint:file-ignore U1000 Ignore all unused code +package searchinsertposition + +/* +オーバーフローを起こさないようにmidの計算方法を修正した +https://github.com/hayashi-ay/leetcode/blob/064fca989bc4ecf9c7bce70237524a3e7ab1a21a/35.%20Search%20Insert%20Position.md?plain=1#L6 +*/ +func searchInsert_step3(nums []int, target int) int { + left, right := 0, len(nums) + for left < right { + mid := left + (right-left)/2 + if nums[mid] == target { + return mid + } + if nums[mid] < target { + left = mid + 1 + } else { + right = mid + } + } + return left +} From dedc88b31e3d06279e9da362a697754cd7fdf837 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 10 Aug 2024 16:22:33 +0900 Subject: [PATCH 216/396] Combination Sum --- go/combination_sum.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 go/combination_sum.go diff --git a/go/combination_sum.go b/go/combination_sum.go new file mode 100644 index 0000000..5bec748 --- /dev/null +++ b/go/combination_sum.go @@ -0,0 +1,26 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +func combinationSum(candidates []int, target int) [][]int { + var combinations [][]int + var stack []int + var findCombinations func(int, int) + findCombinations = func(curr int, sum int) { + if sum == target { + combination := make([]int, len(stack)) + copy(combination, stack) + combinations = append(combinations, combination) + return + } + if sum > target { + return + } + for i := curr; i < len(candidates); i++ { + stack = append(stack, candidates[i]) + findCombinations(i, sum+candidates[i]) + stack = stack[:len(stack)-1] + } + } + findCombinations(0, 0) + return combinations +} From b1ec73bec7bf1735791d0836eace35597d0ae06f Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 10 Aug 2024 16:47:56 +0900 Subject: [PATCH 217/396] refactor Combination Sum --- go/combination_sum.go | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/go/combination_sum.go b/go/combination_sum.go index 5bec748..5a97bf0 100644 --- a/go/combination_sum.go +++ b/go/combination_sum.go @@ -4,12 +4,10 @@ package main func combinationSum(candidates []int, target int) [][]int { var combinations [][]int var stack []int - var findCombinations func(int, int) - findCombinations = func(curr int, sum int) { + var generateCombinations func(int, int) + generateCombinations = func(curr int, sum int) { if sum == target { - combination := make([]int, len(stack)) - copy(combination, stack) - combinations = append(combinations, combination) + combinations = append(combinations, append([]int{}, stack...)) return } if sum > target { @@ -17,10 +15,10 @@ func combinationSum(candidates []int, target int) [][]int { } for i := curr; i < len(candidates); i++ { stack = append(stack, candidates[i]) - findCombinations(i, sum+candidates[i]) + generateCombinations(i, sum+candidates[i]) stack = stack[:len(stack)-1] } } - findCombinations(0, 0) + generateCombinations(0, 0) return combinations } From 0750528c95e5057d9b8aa665f46f18976703acfb Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 10 Aug 2024 17:01:11 +0900 Subject: [PATCH 218/396] refactor Combination Sum --- go/combination_sum.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/go/combination_sum.go b/go/combination_sum.go index 5a97bf0..ec6bc4b 100644 --- a/go/combination_sum.go +++ b/go/combination_sum.go @@ -5,7 +5,7 @@ func combinationSum(candidates []int, target int) [][]int { var combinations [][]int var stack []int var generateCombinations func(int, int) - generateCombinations = func(curr int, sum int) { + generateCombinations = func(currentIndex int, sum int) { if sum == target { combinations = append(combinations, append([]int{}, stack...)) return @@ -13,7 +13,7 @@ func combinationSum(candidates []int, target int) [][]int { if sum > target { return } - for i := curr; i < len(candidates); i++ { + for i := currentIndex; i < len(candidates); i++ { stack = append(stack, candidates[i]) generateCombinations(i, sum+candidates[i]) stack = stack[:len(stack)-1] From 01839fd1f20a850daeb9f2ecc6f75c22b68e1979 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 10 Aug 2024 18:33:14 +0900 Subject: [PATCH 219/396] another solutions for Combination Sum --- go/combination_sum.go | 48 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/go/combination_sum.go b/go/combination_sum.go index ec6bc4b..d8548cb 100644 --- a/go/combination_sum.go +++ b/go/combination_sum.go @@ -1,7 +1,53 @@ //lint:file-ignore U1000 Ignore all unused code package main -func combinationSum(candidates []int, target int) [][]int { +import "sort" + +func combinationSum_dp(candidates []int, target int) [][]int { + combinations := make([][][]int, target+1) + combinations[0] = [][]int{{}} + for _, candidate := range candidates { + for i := candidate; i <= target; i++ { + for _, combination := range combinations[i-candidate] { + newCombination := append([]int(nil), combination...) + newCombination = append(newCombination, candidate) + combinations[i] = append(combinations[i], newCombination) + } + } + } + return combinations[target] +} + +func combinationSum_backtracking_stack(candidates []int, target int) [][]int { + sort.Ints(candidates) + combinations := [][]int{} + type state struct { + combination []int + sum int + index int + } + stack := []state{{[]int{}, 0, 0}} + for len(stack) > 0 { + current := stack[len(stack)-1] + stack = stack[:len(stack)-1] + if current.sum == target { + combinations = append(combinations, append([]int{}, current.combination...)) + continue + } + for i := current.index; i < len(candidates); i++ { + newSum := current.sum + candidates[i] + if newSum > target { + break + } + newCombination := append([]int{}, current.combination...) + newCombination = append(newCombination, candidates[i]) + stack = append(stack, state{newCombination, newSum, i}) + } + } + return combinations +} + +func combinationSum_backtracking_recursion(candidates []int, target int) [][]int { var combinations [][]int var stack []int var generateCombinations func(int, int) From 358b28ab01836f162aa28c9fdfc1bcda62ad7917 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 11 Aug 2024 00:43:28 +0900 Subject: [PATCH 220/396] refactor Combination Sum --- go/combination_sum.go | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/go/combination_sum.go b/go/combination_sum.go index d8548cb..8aa89c9 100644 --- a/go/combination_sum.go +++ b/go/combination_sum.go @@ -4,18 +4,18 @@ package main import "sort" func combinationSum_dp(candidates []int, target int) [][]int { - combinations := make([][][]int, target+1) - combinations[0] = [][]int{{}} + combinationsGroups := make([][][]int, target+1) + combinationsGroups[0] = [][]int{{}} for _, candidate := range candidates { for i := candidate; i <= target; i++ { - for _, combination := range combinations[i-candidate] { - newCombination := append([]int(nil), combination...) + for _, combination := range combinationsGroups[i-candidate] { + newCombination := append([]int{}, combination...) newCombination = append(newCombination, candidate) - combinations[i] = append(combinations[i], newCombination) + combinationsGroups[i] = append(combinationsGroups[i], newCombination) } } } - return combinations[target] + return combinationsGroups[target] } func combinationSum_backtracking_stack(candidates []int, target int) [][]int { @@ -68,3 +68,24 @@ func combinationSum_backtracking_recursion(candidates []int, target int) [][]int generateCombinations(0, 0) return combinations } + +// https://discord.com/channels/1084280443945353267/1233603535862628432/1237744279363915878 +// https://github.com/Exzrgs/LeetCode/pull/13#discussion_r1606819961 +// https://github.com/fhiyo/leetcode/pull/52#issuecomment-2248269934 +// Goは、ランタイムのスタックサイズがデフォルトが小さく、かつスタックサイズの大きさを最小にするような最適化を行っていないため、深さの数だけスタックを浪費する実装になっており、再帰の深さが極端に処理性能が落ちる要因になる。そのため、Goに慣れた人は自然と深い再帰処理はループ処理に書き換えるらしい? +// https://ymotongpoo.hatenablog.com/entry/2015/02/23/165341 +// https://zenn.dev/nobonobo/articles/e651c66a15aaed657d6e#%E6%80%A7%E8%83%BD%E3%81%AFgo%E4%B8%AD%E7%B4%9A%E3%81%A7c%2B%2B%E7%8E%84%E4%BA%BA%E3%81%AE9%E5%89%B2%E4%BB%A5%E4%B8%8A +// なぜbacktracking_stackの場合はsortしないとバグる? +// 末尾再帰? +// この前解いたバックトラッキングの問題をDPで解いてみる +// 全ての組み合わせを出すのはバックトラッキングとDP以外になんかあったけ?それぞれのPros Consは? +// appendは容量が余ってるとそのまま要素を入れるとかGPTが言ってなかったっけ + +// https://github.com/hayashi-ay/leetcode/pull/4 +// https://github.com/hayashi-ay/leetcode/pull/65 +// https://github.com/shining-ai/leetcode/pull/52 +// https://github.com/SuperHotDogCat/coding-interview/pull/11 +// https://github.com/goto-untrapped/Arai60/pull/15 +// https://github.com/Exzrgs/LeetCode/pull/13 +// https://github.com/nittoco/leetcode/pull/25 +// https://github.com/fhiyo/leetcode/pull/52 From 88109ed4f2bdf1207f6688dfc31fcf0d56452b82 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 11 Aug 2024 00:59:13 +0900 Subject: [PATCH 221/396] fix typo --- go/combination_sum.go | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/go/combination_sum.go b/go/combination_sum.go index 8aa89c9..30e6486 100644 --- a/go/combination_sum.go +++ b/go/combination_sum.go @@ -68,24 +68,3 @@ func combinationSum_backtracking_recursion(candidates []int, target int) [][]int generateCombinations(0, 0) return combinations } - -// https://discord.com/channels/1084280443945353267/1233603535862628432/1237744279363915878 -// https://github.com/Exzrgs/LeetCode/pull/13#discussion_r1606819961 -// https://github.com/fhiyo/leetcode/pull/52#issuecomment-2248269934 -// Goは、ランタイムのスタックサイズがデフォルトが小さく、かつスタックサイズの大きさを最小にするような最適化を行っていないため、深さの数だけスタックを浪費する実装になっており、再帰の深さが極端に処理性能が落ちる要因になる。そのため、Goに慣れた人は自然と深い再帰処理はループ処理に書き換えるらしい? -// https://ymotongpoo.hatenablog.com/entry/2015/02/23/165341 -// https://zenn.dev/nobonobo/articles/e651c66a15aaed657d6e#%E6%80%A7%E8%83%BD%E3%81%AFgo%E4%B8%AD%E7%B4%9A%E3%81%A7c%2B%2B%E7%8E%84%E4%BA%BA%E3%81%AE9%E5%89%B2%E4%BB%A5%E4%B8%8A -// なぜbacktracking_stackの場合はsortしないとバグる? -// 末尾再帰? -// この前解いたバックトラッキングの問題をDPで解いてみる -// 全ての組み合わせを出すのはバックトラッキングとDP以外になんかあったけ?それぞれのPros Consは? -// appendは容量が余ってるとそのまま要素を入れるとかGPTが言ってなかったっけ - -// https://github.com/hayashi-ay/leetcode/pull/4 -// https://github.com/hayashi-ay/leetcode/pull/65 -// https://github.com/shining-ai/leetcode/pull/52 -// https://github.com/SuperHotDogCat/coding-interview/pull/11 -// https://github.com/goto-untrapped/Arai60/pull/15 -// https://github.com/Exzrgs/LeetCode/pull/13 -// https://github.com/nittoco/leetcode/pull/25 -// https://github.com/fhiyo/leetcode/pull/52 From ac19de3c07179514d8c22a24f3b547a1e9b1f62c Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 11 Aug 2024 16:49:18 +0900 Subject: [PATCH 222/396] fix Combination Sum --- go/combination_sum.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/go/combination_sum.go b/go/combination_sum.go index 30e6486..d65b247 100644 --- a/go/combination_sum.go +++ b/go/combination_sum.go @@ -1,8 +1,6 @@ //lint:file-ignore U1000 Ignore all unused code package main -import "sort" - func combinationSum_dp(candidates []int, target int) [][]int { combinationsGroups := make([][][]int, target+1) combinationsGroups[0] = [][]int{{}} @@ -19,7 +17,6 @@ func combinationSum_dp(candidates []int, target int) [][]int { } func combinationSum_backtracking_stack(candidates []int, target int) [][]int { - sort.Ints(candidates) combinations := [][]int{} type state struct { combination []int @@ -37,7 +34,7 @@ func combinationSum_backtracking_stack(candidates []int, target int) [][]int { for i := current.index; i < len(candidates); i++ { newSum := current.sum + candidates[i] if newSum > target { - break + continue } newCombination := append([]int{}, current.combination...) newCombination = append(newCombination, candidates[i]) From 65d15cc942bfa561d97710aaacdea13efaded6c6 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 11 Aug 2024 17:54:02 +0900 Subject: [PATCH 223/396] pullrequests/combination_sum --- pullrequests/combination_sum/step1.go | 30 ++++++++++++++ pullrequests/combination_sum/step2.go | 56 +++++++++++++++++++++++++++ pullrequests/combination_sum/step3.go | 21 ++++++++++ 3 files changed, 107 insertions(+) create mode 100644 pullrequests/combination_sum/step1.go create mode 100644 pullrequests/combination_sum/step2.go create mode 100644 pullrequests/combination_sum/step3.go diff --git a/pullrequests/combination_sum/step1.go b/pullrequests/combination_sum/step1.go new file mode 100644 index 0000000..03e2ad5 --- /dev/null +++ b/pullrequests/combination_sum/step1.go @@ -0,0 +1,30 @@ +//lint:file-ignore U1000 Ignore all unused code +package template + +/* +時間:24分 +少し前にバックトラッキングの問題を解いたので、ある条件を満たす全ての組み合わせを求めるためにバックトラッキングを使って解きました。 +*/ +func combinationSum_step1(candidates []int, target int) [][]int { + var combinations [][]int + var stack []int + var findCombinations func(int, int) + findCombinations = func(curr int, sum int) { + if sum == target { + combination := make([]int, len(stack)) + copy(combination, stack) + combinations = append(combinations, combination) + return + } + if sum > target { + return + } + for i := curr; i < len(candidates); i++ { + stack = append(stack, candidates[i]) + findCombinations(i, sum+candidates[i]) + stack = stack[:len(stack)-1] + } + } + findCombinations(0, 0) + return combinations +} diff --git a/pullrequests/combination_sum/step2.go b/pullrequests/combination_sum/step2.go new file mode 100644 index 0000000..85acb26 --- /dev/null +++ b/pullrequests/combination_sum/step2.go @@ -0,0 +1,56 @@ +//lint:file-ignore U1000 Ignore all unused code +package template + +/* +Step1では再帰を使ってバックトラッキングを解いたので、スタックを使った方法も実装しました。 +また、Step1の実装のリファクタもしました。 +*/ +func combinationSum_backtracking_stack(candidates []int, target int) [][]int { + combinations := [][]int{} + type state struct { + combination []int + sum int + index int + } + stack := []state{{[]int{}, 0, 0}} + for len(stack) > 0 { + current := stack[len(stack)-1] + stack = stack[:len(stack)-1] + if current.sum == target { + combinations = append(combinations, append([]int{}, current.combination...)) + continue + } + for i := current.index; i < len(candidates); i++ { + newSum := current.sum + candidates[i] + if newSum > target { + continue + } + newCombination := append([]int{}, current.combination...) + newCombination = append(newCombination, candidates[i]) + stack = append(stack, state{newCombination, newSum, i}) + } + } + return combinations +} + +func combinationSum_backtracking_recursion(candidates []int, target int) [][]int { + var combinations [][]int + var stack []int + var generateCombinations func(int, int) + generateCombinations = func(currentIndex int, sum int) { + if sum == target { + combinations = append(combinations, append([]int{}, stack...)) + return + } + if sum > target { + return + } + for i := currentIndex; i < len(candidates); i++ { + stack = append(stack, candidates[i]) + generateCombinations(i, sum+candidates[i]) + stack = stack[:len(stack)-1] + } + } + generateCombinations(0, 0) + return combinations +} diff --git a/pullrequests/combination_sum/step3.go b/pullrequests/combination_sum/step3.go new file mode 100644 index 0000000..08a3b32 --- /dev/null +++ b/pullrequests/combination_sum/step3.go @@ -0,0 +1,21 @@ +//lint:file-ignore U1000 Ignore all unused code +package template + +/* +動的計画法を使った方法も実装しました。 +targetごとに組み合わせを求めると重複する組み合わせが生じてしまうので、candidateごとに組み合わせを求めるようにしました。 +*/ +func combinationSum_dp(candidates []int, target int) [][]int { + combinationsGroups := make([][][]int, target+1) + combinationsGroups[0] = [][]int{{}} + for _, candidate := range candidates { + for i := candidate; i <= target; i++ { + for _, combination := range combinationsGroups[i-candidate] { + newCombination := append([]int{}, combination...) + newCombination = append(newCombination, candidate) + combinationsGroups[i] = append(combinationsGroups[i], newCombination) + } + } + } + return combinationsGroups[target] +} From aacce355931b35480cac46853e3f00c4c17763b7 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 12 Aug 2024 15:28:15 +0900 Subject: [PATCH 224/396] fix mid calculation for binary searches --- go/binary_search.go | 2 +- go/first_bad_version.go | 2 +- go/search_in_rotated_sorted_array.go | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go/binary_search.go b/go/binary_search.go index a60ad7d..0ed0356 100644 --- a/go/binary_search.go +++ b/go/binary_search.go @@ -4,7 +4,7 @@ package main func search(nums []int, target int) int { l, r := 0, len(nums)-1 for l <= r { - mid := (l + r) / 2 + mid := l + (r-l)/2 if target == nums[mid] { return mid diff --git a/go/first_bad_version.go b/go/first_bad_version.go index 8623c6b..39bd6fc 100644 --- a/go/first_bad_version.go +++ b/go/first_bad_version.go @@ -10,7 +10,7 @@ func isBadVersion(version int) bool { func firstBadVersion(n int) int { l, r := 1, n for l < r { - mid := (l + r) / 2 + mid := l + (r-l)/2 if isBadVersion(mid) { r = mid } else { diff --git a/go/search_in_rotated_sorted_array.go b/go/search_in_rotated_sorted_array.go index d6d31ac..ff258d9 100644 --- a/go/search_in_rotated_sorted_array.go +++ b/go/search_in_rotated_sorted_array.go @@ -4,7 +4,7 @@ package main func search_closed(nums []int, target int) int { left, right := 0, len(nums)-1 for left <= right { - mid := (left + right) / 2 + mid := left + (right-left)/2 if target == nums[mid] { return mid } @@ -28,7 +28,7 @@ func search_closed(nums []int, target int) int { func search_half_closed(nums []int, target int) int { left, right := 0, len(nums) for left < right { - mid := (left + right) / 2 + mid := left + (right-left)/2 if target == nums[mid] { return mid } From e708723803a7803c23235155e42c5cf2c24a022b Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 12 Aug 2024 15:57:18 +0900 Subject: [PATCH 225/396] refactor Search Insert Position --- go/search_insert_position.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/go/search_insert_position.go b/go/search_insert_position.go index 149acd3..9fdfb80 100644 --- a/go/search_insert_position.go +++ b/go/search_insert_position.go @@ -5,9 +5,6 @@ func searchInsert(nums []int, target int) int { left, right := 0, len(nums) for left < right { mid := left + (right-left)/2 - if nums[mid] == target { - return mid - } if nums[mid] < target { left = mid + 1 } else { From 25b7daee5a50e0fe0b17930da5734ca1c1f65bbb Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 12 Aug 2024 16:08:24 +0900 Subject: [PATCH 226/396] refactor Merge Two Sorted Lists --- go/merge_two_sorted_lists.go | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/go/merge_two_sorted_lists.go b/go/merge_two_sorted_lists.go index c4f3833..0502def 100644 --- a/go/merge_two_sorted_lists.go +++ b/go/merge_two_sorted_lists.go @@ -4,7 +4,6 @@ package main func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode { dummy := new(ListNode) tail := dummy - for list1 != nil && list2 != nil { if list1.Val < list2.Val { tail.Next, list1 = list1, list1.Next @@ -13,39 +12,11 @@ func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode { } tail = tail.Next } - if list1 != nil { tail.Next = list1 } if list2 != nil { tail.Next = list2 } - - return dummy.Next -} - -func mergeTwoLists2(list1 *ListNode, list2 *ListNode) *ListNode { - dummy := new(ListNode) - tail := dummy - - for list1 != nil || list2 != nil { - if list1 == nil { - tail.Next = list2 - break - } - if list2 == nil { - tail.Next = list1 - break - } - - if list1.Val < list2.Val { - tail.Next, list1 = list1, list1.Next - } else { - tail.Next, list2 = list2, list2.Next - } - tail = tail.Next - tail.Next = nil - } - return dummy.Next } From 3e23ed4a8b793cf7f342f684439959a37fe8f78d Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 12 Aug 2024 16:10:22 +0900 Subject: [PATCH 227/396] add step4 for Merge Two Sorted Lists --- pullrequests/merge_two_sorted_lists/step4.go | 22 ++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 pullrequests/merge_two_sorted_lists/step4.go diff --git a/pullrequests/merge_two_sorted_lists/step4.go b/pullrequests/merge_two_sorted_lists/step4.go new file mode 100644 index 0000000..88f9858 --- /dev/null +++ b/pullrequests/merge_two_sorted_lists/step4.go @@ -0,0 +1,22 @@ +//lint:file-ignore U1000 Ignore all unused code +package mergetwosortedlists + +func mergeTwoLists_step4(list1 *ListNode, list2 *ListNode) *ListNode { + dummy := new(ListNode) + tail := dummy + for list1 != nil && list2 != nil { + if list1.Val < list2.Val { + tail.Next, list1 = list1, list1.Next + } else { + tail.Next, list2 = list2, list2.Next + } + tail = tail.Next + } + if list1 != nil { + tail.Next = list1 + } + if list2 != nil { + tail.Next = list2 + } + return dummy.Next +} From 372314e08eaf9ee072484d70043c7a8ca8d75d3d Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 12 Aug 2024 16:23:59 +0900 Subject: [PATCH 228/396] refactor Reverse Linked List --- go/reverse_linked_list.go | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/go/reverse_linked_list.go b/go/reverse_linked_list.go index 31850e2..7c6a3b1 100644 --- a/go/reverse_linked_list.go +++ b/go/reverse_linked_list.go @@ -2,20 +2,21 @@ package main func reverseList_iterative(head *ListNode) *ListNode { + curr := head var prev *ListNode - for head != nil { - prev, head, head.Next = head, head.Next, prev + for curr != nil { + prev, curr, curr.Next = curr, curr.Next, prev } return prev } func reverseList_recurssive(head *ListNode) *ListNode { - if head == nil || head.Next == nil { - return head + curr := head + if curr == nil || curr.Next == nil { + return curr } - - next := head.Next + next := curr.Next reversedHead := reverseList_recurssive(next) - head.Next, next.Next = nil, head + curr.Next, next.Next = nil, curr return reversedHead } From 44a150e1b5565694452c6897f6a074ab33baeff7 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 12 Aug 2024 16:25:21 +0900 Subject: [PATCH 229/396] add step4 for Reverse Linked List --- pullrequests/reverse_linked_list/step4.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 pullrequests/reverse_linked_list/step4.go diff --git a/pullrequests/reverse_linked_list/step4.go b/pullrequests/reverse_linked_list/step4.go new file mode 100644 index 0000000..bff0146 --- /dev/null +++ b/pullrequests/reverse_linked_list/step4.go @@ -0,0 +1,22 @@ +//lint:file-ignore U1000 Ignore all unused code +package reverselinkedlist + +func reverseList_iterative_step4(head *ListNode) *ListNode { + curr := head + var prev *ListNode + for curr != nil { + prev, curr, curr.Next = curr, curr.Next, prev + } + return prev +} + +func reverseList_recurssive_step4(head *ListNode) *ListNode { + curr := head + if curr == nil || curr.Next == nil { + return curr + } + next := curr.Next + reversedHead := reverseList_recurssive_step4(next) + curr.Next, next.Next = nil, curr + return reversedHead +} From 2a167018624e20219eb90f2d098e2c3d0465fdc1 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 12 Aug 2024 16:39:02 +0900 Subject: [PATCH 230/396] refactor Group Anagrams --- go/group_anagrams.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/go/group_anagrams.go b/go/group_anagrams.go index bdce6cc..a33bfe4 100644 --- a/go/group_anagrams.go +++ b/go/group_anagrams.go @@ -2,20 +2,20 @@ package main func groupAnagrams(strs []string) [][]string { - m := make(map[[26]int][]string) + anagramsMap := make(map[[26]int][]string) for _, word := range strs { - var freq [26]int + var frequency [26]int for _, r := range word { - freq[r-'a']++ + frequency[r-'a']++ } - m[freq] = append(m[freq], word) + anagramsMap[frequency] = append(anagramsMap[frequency], word) } - res := make([][]string, len(m)) + anagrams := make([][]string, len(anagramsMap)) i := 0 - for _, words := range m { - res[i] = words + for _, words := range anagramsMap { + anagrams[i] = words i++ } - return res + return anagrams } From 2b6f835d699a21c94e11fdd18a23244897f050da Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 12 Aug 2024 16:39:59 +0900 Subject: [PATCH 231/396] add step4 for Group Anagrams --- pullrequests/group_anagrams/step4.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 pullrequests/group_anagrams/step4.go diff --git a/pullrequests/group_anagrams/step4.go b/pullrequests/group_anagrams/step4.go new file mode 100644 index 0000000..4e586a6 --- /dev/null +++ b/pullrequests/group_anagrams/step4.go @@ -0,0 +1,21 @@ +//lint:file-ignore U1000 Ignore all unused code +package groupanagrams + +func groupAnagrams(strs []string) [][]string { + anagramsMap := make(map[[26]int][]string) + for _, word := range strs { + var frequency [26]int + for _, r := range word { + frequency[r-'a']++ + } + anagramsMap[frequency] = append(anagramsMap[frequency], word) + } + + anagrams := make([][]string, len(anagramsMap)) + i := 0 + for _, words := range anagramsMap { + anagrams[i] = words + i++ + } + return anagrams +} From 6b91996f702041508ca239235a60c928bd1f5751 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 12 Aug 2024 16:42:48 +0900 Subject: [PATCH 232/396] refactor Contains Duplicate --- go/contains_duplicate.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/go/contains_duplicate.go b/go/contains_duplicate.go index df42a80..8700cef 100644 --- a/go/contains_duplicate.go +++ b/go/contains_duplicate.go @@ -2,12 +2,12 @@ package main func containsDuplicate(nums []int) bool { - m := make(map[int]struct{}) + seen := make(map[int]struct{}) for _, n := range nums { - if _, ok := m[n]; ok { + if _, ok := seen[n]; ok { return true } - m[n] = struct{}{} + seen[n] = struct{}{} } return false } From c7da8fc7687ab7cc86cf8b016ab62a698bfb2ec5 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 12 Aug 2024 16:44:08 +0900 Subject: [PATCH 233/396] add step3 for Contains Duplicate --- pullrequests/contains_duplicate/step3.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 pullrequests/contains_duplicate/step3.go diff --git a/pullrequests/contains_duplicate/step3.go b/pullrequests/contains_duplicate/step3.go new file mode 100644 index 0000000..cc26164 --- /dev/null +++ b/pullrequests/contains_duplicate/step3.go @@ -0,0 +1,13 @@ +//lint:file-ignore U1000 Ignore all unused code +package containsduplicate + +func containsDuplicate(nums []int) bool { + seen := make(map[int]struct{}) + for _, n := range nums { + if _, ok := seen[n]; ok { + return true + } + seen[n] = struct{}{} + } + return false +} From 82d9c897e4669c7216e726983b8ee756b80af160 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 12 Aug 2024 21:13:00 +0900 Subject: [PATCH 234/396] refactor Valid Anagram --- go/valid_anagram.go | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/go/valid_anagram.go b/go/valid_anagram.go index d53476e..c711e11 100644 --- a/go/valid_anagram.go +++ b/go/valid_anagram.go @@ -2,21 +2,18 @@ package main func isAnagram(s string, t string) bool { - var frequency [26]int + var frequencyS, frequencyT [26]int for _, r := range s { - frequency[r-'a']++ + frequencyS[r-'a']++ } for _, r := range t { - frequency[r-'a']-- + frequencyT[r-'a']++ } - for _, n := range frequency { - if n != 0 { - return false - } - } - return true + return frequencyS == frequencyT } +// ちゃんとUnicodeに対応させるなら結合文字などを考慮する必要がある +// https://github.com/rihib/leetcode/pull/5#discussion_r1706198268 func isAnagram_unicode(s string, t string) bool { frequency := make(map[rune]int) for _, r := range s { From 65bf37fe332deb1bac65eefcf24a223150973e8a Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 12 Aug 2024 21:22:10 +0900 Subject: [PATCH 235/396] refactor Valid Anagram --- go/valid_anagram.go | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/go/valid_anagram.go b/go/valid_anagram.go index c711e11..417df46 100644 --- a/go/valid_anagram.go +++ b/go/valid_anagram.go @@ -2,14 +2,15 @@ package main func isAnagram(s string, t string) bool { - var frequencyS, frequencyT [26]int + return frequency(s) == frequency(t) +} + +func frequency(s string) [26]int { + var f [26]int for _, r := range s { - frequencyS[r-'a']++ - } - for _, r := range t { - frequencyT[r-'a']++ + f[r-'a']++ } - return frequencyS == frequencyT + return f } // ちゃんとUnicodeに対応させるなら結合文字などを考慮する必要がある From 13be05060854adbf5e0d41daa3064f106ae8f743 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 12 Aug 2024 21:27:41 +0900 Subject: [PATCH 236/396] add step3 for Valid Anagram --- pullrequests/valid_anagram/step3.go | 32 +++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 pullrequests/valid_anagram/step3.go diff --git a/pullrequests/valid_anagram/step3.go b/pullrequests/valid_anagram/step3.go new file mode 100644 index 0000000..a3ba67b --- /dev/null +++ b/pullrequests/valid_anagram/step3.go @@ -0,0 +1,32 @@ +//lint:file-ignore U1000 Ignore all unused code +package validanagram + +func isAnagram_step3(s string, t string) bool { + return frequency(s) == frequency(t) +} + +func frequency(s string) [26]int { + var f [26]int + for _, r := range s { + f[r-'a']++ + } + return f +} + +// ちゃんとUnicodeに対応させるなら結合文字などを考慮する必要がある +// https://github.com/rihib/leetcode/pull/5#discussion_r1706198268 +func isAnagram_unicode_step3(s string, t string) bool { + frequency := make(map[rune]int) + for _, r := range s { + frequency[r]++ + } + for _, r := range t { + frequency[r]-- + } + for _, n := range frequency { + if n != 0 { + return false + } + } + return true +} From 59cbe758d156c03a754b44bcb9ad0fe2b4c138cc Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 12 Aug 2024 21:45:00 +0900 Subject: [PATCH 237/396] refactor Longest Substring Without Repeating Characters --- ...est_substring_without_repeating_characters.go | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/go/longest_substring_without_repeating_characters.go b/go/longest_substring_without_repeating_characters.go index 0c2d68a..d72e441 100644 --- a/go/longest_substring_without_repeating_characters.go +++ b/go/longest_substring_without_repeating_characters.go @@ -2,15 +2,13 @@ package main func lengthOfLongestSubstring(s string) int { - maxLen, head := 0, 0 - inUse := make(map[byte]bool) - for tail := range s { - for inUse[s[tail]] { - delete(inUse, s[head]) - head++ + maxLength, left, seen := 0, 0, make(map[rune]int) + for right, r := range s { + if lastIndex, ok := seen[r]; ok && lastIndex >= left { + left = lastIndex + 1 } - inUse[s[tail]] = true - maxLen = max(maxLen, tail-head+1) + seen[r] = right + maxLength = max(maxLength, right-left+1) } - return maxLen + return maxLength } From 5b61f41d8372b051ccef3eb8d14ba49e5d8002e3 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 12 Aug 2024 21:46:21 +0900 Subject: [PATCH 238/396] add step4 for Longest Substring Without Repeating Characters --- .../step4.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 pullrequests/longest_substring_without_repeating_characters/step4.go diff --git a/pullrequests/longest_substring_without_repeating_characters/step4.go b/pullrequests/longest_substring_without_repeating_characters/step4.go new file mode 100644 index 0000000..300d2e3 --- /dev/null +++ b/pullrequests/longest_substring_without_repeating_characters/step4.go @@ -0,0 +1,14 @@ +//lint:file-ignore U1000 Ignore all unused code +package longestsubstringwithoutrepeatingcharacters + +func lengthOfLongestSubstring_step4(s string) int { + maxLength, left, seen := 0, 0, make(map[rune]int) + for right, r := range s { + if lastIndex, ok := seen[r]; ok && lastIndex >= left { + left = lastIndex + 1 + } + seen[r] = right + maxLength = max(maxLength, right-left+1) + } + return maxLength +} From e316101a9c1533bace545f359aa63e805ca69aa7 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 12 Aug 2024 21:54:50 +0900 Subject: [PATCH 239/396] refactor Zigzag Conversion --- go/zigzag_conversion.go | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/go/zigzag_conversion.go b/go/zigzag_conversion.go index 5bc6bbc..0747a7d 100644 --- a/go/zigzag_conversion.go +++ b/go/zigzag_conversion.go @@ -9,13 +9,13 @@ func convert(s string, numRows int) string { } rows := make([]strings.Builder, numRows) - cycleLen := 2*numRows - 2 + cycleLength := 2*numRows - 2 for i, r := range s { - rowNum := i % cycleLen - if rowNum >= numRows { - rowNum = cycleLen - rowNum + rowIndex := i % cycleLength + if rowIndex >= numRows { + rowIndex = cycleLength - rowIndex } - rows[rowNum].WriteRune(r) + rows[rowIndex].WriteRune(r) } var oneline strings.Builder @@ -30,15 +30,16 @@ func convert_anothersolution(s string, numRows int) string { return s } var oneline strings.Builder - cycleLen := 2*numRows - 2 - for rowNum := 0; rowNum < numRows; rowNum++ { - for i := rowNum; i < len(s); i += cycleLen { + cycleLength := 2*numRows - 2 + for rowIndex := 0; rowIndex < numRows; rowIndex++ { + for i := rowIndex; i < len(s); i += cycleLength { oneline.WriteByte(s[i]) - if 0 < rowNum && rowNum < numRows-1 { - diagIdx := i + cycleLen - rowNum*2 - if diagIdx < len(s) { - oneline.WriteByte(s[diagIdx]) - } + if rowIndex == 0 || rowIndex == numRows-1 { + continue + } + diagIndex := i + cycleLength - rowIndex*2 + if diagIndex < len(s) { + oneline.WriteByte(s[diagIndex]) } } } From 562b955dad6e25d7c80fe28cad042ccc94e6f213 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 12 Aug 2024 21:56:16 +0900 Subject: [PATCH 240/396] add step4 for Zigzag Conversion --- pullrequests/zigzag_conversion/step4.go | 47 +++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 pullrequests/zigzag_conversion/step4.go diff --git a/pullrequests/zigzag_conversion/step4.go b/pullrequests/zigzag_conversion/step4.go new file mode 100644 index 0000000..eeaa1f6 --- /dev/null +++ b/pullrequests/zigzag_conversion/step4.go @@ -0,0 +1,47 @@ +//lint:file-ignore U1000 Ignore all unused code +package zigzagconversion + +import "strings" + +func convert(s string, numRows int) string { + if numRows == 1 { + return s + } + + rows := make([]strings.Builder, numRows) + cycleLength := 2*numRows - 2 + for i, r := range s { + rowIndex := i % cycleLength + if rowIndex >= numRows { + rowIndex = cycleLength - rowIndex + } + rows[rowIndex].WriteRune(r) + } + + var oneline strings.Builder + for _, row := range rows { + oneline.WriteString(row.String()) + } + return oneline.String() +} + +func convert_anothersolution(s string, numRows int) string { + if numRows == 1 { + return s + } + var oneline strings.Builder + cycleLength := 2*numRows - 2 + for rowIndex := 0; rowIndex < numRows; rowIndex++ { + for i := rowIndex; i < len(s); i += cycleLength { + oneline.WriteByte(s[i]) + if rowIndex == 0 || rowIndex == numRows-1 { + continue + } + diagIndex := i + cycleLength - rowIndex*2 + if diagIndex < len(s) { + oneline.WriteByte(s[diagIndex]) + } + } + } + return oneline.String() +} From e108fe7170f176a693f69482beb5a040940ced2d Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 12 Aug 2024 22:27:18 +0900 Subject: [PATCH 241/396] add step4 for Search Insert Position --- pullrequests/search_insert_position/step4.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 pullrequests/search_insert_position/step4.go diff --git a/pullrequests/search_insert_position/step4.go b/pullrequests/search_insert_position/step4.go new file mode 100644 index 0000000..345396d --- /dev/null +++ b/pullrequests/search_insert_position/step4.go @@ -0,0 +1,15 @@ +//lint:file-ignore U1000 Ignore all unused code +package searchinsertposition + +func searchInsert(nums []int, target int) int { + left, right := 0, len(nums) + for left < right { + mid := left + (right-left)/2 + if nums[mid] < target { + left = mid + 1 + } else { + right = mid + } + } + return left +} From 666c78e8f4b54be0fa025ba91c6f0a144d2446a8 Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 13 Aug 2024 14:05:31 +0900 Subject: [PATCH 242/396] Permutations --- go/permutations.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 go/permutations.go diff --git a/go/permutations.go b/go/permutations.go new file mode 100644 index 0000000..0ebfc9c --- /dev/null +++ b/go/permutations.go @@ -0,0 +1,26 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +func permute(nums []int) [][]int { + var permutations [][]int + var stack []int + var generate func(map[int]struct{}) + generate = func(inUse map[int]struct{}) { + if len(stack) == len(nums) { + permutations = append(permutations, append([]int{}, stack...)) + return + } + for _, n := range nums { + if _, ok := inUse[n]; !ok { + stack = append(stack, n) + inUse[n] = struct{}{} + generate(inUse) + stack = stack[:len(stack)-1] + delete(inUse, n) + } + } + } + inUse := make(map[int]struct{}) + generate(inUse) + return permutations +} From a2537d81cd5472acd6d6dd501de74e5ec0578120 Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 13 Aug 2024 14:22:04 +0900 Subject: [PATCH 243/396] refactor Permutations --- go/permutations.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/go/permutations.go b/go/permutations.go index 0ebfc9c..113c581 100644 --- a/go/permutations.go +++ b/go/permutations.go @@ -20,7 +20,6 @@ func permute(nums []int) [][]int { } } } - inUse := make(map[int]struct{}) - generate(inUse) + generate(make(map[int]struct{})) return permutations } From 6ace02f5a547be005e31483f7484583c894b0619 Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 13 Aug 2024 14:43:47 +0900 Subject: [PATCH 244/396] refactor Permutations --- go/permutations.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/go/permutations.go b/go/permutations.go index 113c581..49c077f 100644 --- a/go/permutations.go +++ b/go/permutations.go @@ -3,9 +3,10 @@ package main func permute(nums []int) [][]int { var permutations [][]int - var stack []int - var generate func(map[int]struct{}) - generate = func(inUse map[int]struct{}) { + stack := make([]int, 0, len(nums)) + inUse := make(map[int]struct{}) + var generate func() + generate = func() { if len(stack) == len(nums) { permutations = append(permutations, append([]int{}, stack...)) return @@ -14,12 +15,12 @@ func permute(nums []int) [][]int { if _, ok := inUse[n]; !ok { stack = append(stack, n) inUse[n] = struct{}{} - generate(inUse) + generate() stack = stack[:len(stack)-1] delete(inUse, n) } } } - generate(make(map[int]struct{})) + generate() return permutations } From fde6e381d9eb4f4400bc5c10c8a514c1cc740aae Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 13 Aug 2024 14:45:05 +0900 Subject: [PATCH 245/396] refactor Genereate Parentheses --- go/generate_parentheses.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/generate_parentheses.go b/go/generate_parentheses.go index 834cace..1ec2bd2 100644 --- a/go/generate_parentheses.go +++ b/go/generate_parentheses.go @@ -3,7 +3,7 @@ package main func generateParenthesis(n int) []string { var parentheses []string - var stack []byte + stack := make([]byte, 0, n*2) var generate func(int, int) generate = func(open int, closed int) { if open == n && closed == n { From 03d832d5a77fd4bdaf05bf67d15a9acc4e17af6d Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 13 Aug 2024 16:10:41 +0900 Subject: [PATCH 246/396] refactor Generate Parentheses --- go/generate_parentheses.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/go/generate_parentheses.go b/go/generate_parentheses.go index 1ec2bd2..db1c38c 100644 --- a/go/generate_parentheses.go +++ b/go/generate_parentheses.go @@ -3,22 +3,22 @@ package main func generateParenthesis(n int) []string { var parentheses []string - stack := make([]byte, 0, n*2) + parenthesis := make([]byte, 0, n*2) var generate func(int, int) generate = func(open int, closed int) { if open == n && closed == n { - parentheses = append(parentheses, string(stack)) + parentheses = append(parentheses, string(parenthesis)) return } if open < n { - stack = append(stack, '(') + parenthesis = append(parenthesis, '(') generate(open+1, closed) - stack = stack[:len(stack)-1] + parenthesis = parenthesis[:len(parenthesis)-1] } if open > closed { - stack = append(stack, ')') + parenthesis = append(parenthesis, ')') generate(open, closed+1) - stack = stack[:len(stack)-1] + parenthesis = parenthesis[:len(parenthesis)-1] } } generate(0, 0) From 35d704368ff93aad6adc972f9019e7197f939555 Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 13 Aug 2024 16:10:53 +0900 Subject: [PATCH 247/396] refactor Combination Sum --- go/combination_sum.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/go/combination_sum.go b/go/combination_sum.go index d65b247..50490e6 100644 --- a/go/combination_sum.go +++ b/go/combination_sum.go @@ -16,7 +16,7 @@ func combinationSum_dp(candidates []int, target int) [][]int { return combinationsGroups[target] } -func combinationSum_backtracking_stack(candidates []int, target int) [][]int { +func combinationSum_backtracking_iterative(candidates []int, target int) [][]int { combinations := [][]int{} type state struct { combination []int @@ -46,20 +46,20 @@ func combinationSum_backtracking_stack(candidates []int, target int) [][]int { func combinationSum_backtracking_recursion(candidates []int, target int) [][]int { var combinations [][]int - var stack []int + var combination []int var generateCombinations func(int, int) generateCombinations = func(currentIndex int, sum int) { if sum == target { - combinations = append(combinations, append([]int{}, stack...)) + combinations = append(combinations, append([]int{}, combination...)) return } if sum > target { return } for i := currentIndex; i < len(candidates); i++ { - stack = append(stack, candidates[i]) + combination = append(combination, candidates[i]) generateCombinations(i, sum+candidates[i]) - stack = stack[:len(stack)-1] + combination = combination[:len(combination)-1] } } generateCombinations(0, 0) From 90d4ec97fbfc44803aa3d830d24bfc32ee2cb25c Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 13 Aug 2024 16:11:28 +0900 Subject: [PATCH 248/396] refactor Permutations --- go/permutations.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/go/permutations.go b/go/permutations.go index 49c077f..dc9e2d8 100644 --- a/go/permutations.go +++ b/go/permutations.go @@ -1,22 +1,22 @@ //lint:file-ignore U1000 Ignore all unused code package main -func permute(nums []int) [][]int { +func permute_backtracking_recursion(nums []int) [][]int { var permutations [][]int - stack := make([]int, 0, len(nums)) + permutation := make([]int, 0, len(nums)) inUse := make(map[int]struct{}) var generate func() generate = func() { - if len(stack) == len(nums) { - permutations = append(permutations, append([]int{}, stack...)) + if len(permutation) == len(nums) { + permutations = append(permutations, append([]int{}, permutation...)) return } for _, n := range nums { if _, ok := inUse[n]; !ok { - stack = append(stack, n) + permutation = append(permutation, n) inUse[n] = struct{}{} generate() - stack = stack[:len(stack)-1] + permutation = permutation[:len(permutation)-1] delete(inUse, n) } } From 741c0f460c28a965fa06823518f5feda8445ae43 Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 13 Aug 2024 16:11:51 +0900 Subject: [PATCH 249/396] add another solution for Permutations --- go/permutations.go | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/go/permutations.go b/go/permutations.go index dc9e2d8..450d7e0 100644 --- a/go/permutations.go +++ b/go/permutations.go @@ -1,6 +1,45 @@ //lint:file-ignore U1000 Ignore all unused code package main +func permute_backtracking_iterative(nums []int) [][]int { + var permutations [][]int + type state struct { + permutation []int + inUse map[int]struct{} + } + stack := []state{ + { + permutation: []int{}, + inUse: make(map[int]struct{}), + }, + } + for len(stack) > 0 { + current := stack[len(stack)-1] + stack = stack[:len(stack)-1] + if len(current.permutation) == len(nums) { + permutations = append(permutations, current.permutation) + continue + } + for _, n := range nums { + if _, ok := current.inUse[n]; ok { + continue + } + newPermutation := append([]int{}, current.permutation...) + newPermutation = append(newPermutation, n) + newInUse := make(map[int]struct{}) + for k, v := range current.inUse { + newInUse[k] = v + } + newInUse[n] = struct{}{} + stack = append(stack, state{ + permutation: newPermutation, + inUse: newInUse, + }) + } + } + return permutations +} + func permute_backtracking_recursion(nums []int) [][]int { var permutations [][]int permutation := make([]int, 0, len(nums)) From c0298f95cdfd566f04c3128641af3a1b79db4543 Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 13 Aug 2024 16:32:03 +0900 Subject: [PATCH 250/396] refactor Permutations --- go/permutations.go | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/go/permutations.go b/go/permutations.go index 450d7e0..abdd6ab 100644 --- a/go/permutations.go +++ b/go/permutations.go @@ -7,12 +7,7 @@ func permute_backtracking_iterative(nums []int) [][]int { permutation []int inUse map[int]struct{} } - stack := []state{ - { - permutation: []int{}, - inUse: make(map[int]struct{}), - }, - } + stack := []state{{[]int{}, make(map[int]struct{})}} for len(stack) > 0 { current := stack[len(stack)-1] stack = stack[:len(stack)-1] From 567a2013c1ccfdca13d064253c5c115348dedc24 Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 13 Aug 2024 16:48:13 +0900 Subject: [PATCH 251/396] refactor Permutations --- go/permutations.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/go/permutations.go b/go/permutations.go index abdd6ab..703f323 100644 --- a/go/permutations.go +++ b/go/permutations.go @@ -26,10 +26,7 @@ func permute_backtracking_iterative(nums []int) [][]int { newInUse[k] = v } newInUse[n] = struct{}{} - stack = append(stack, state{ - permutation: newPermutation, - inUse: newInUse, - }) + stack = append(stack, state{newPermutation, newInUse}) } } return permutations From b4ccfd7dc544beb66da828b24f59a7535b0dce44 Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 13 Aug 2024 16:48:31 +0900 Subject: [PATCH 252/396] add another solution for Generate Parentheses --- go/generate_parentheses.go | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/go/generate_parentheses.go b/go/generate_parentheses.go index db1c38c..0cb6376 100644 --- a/go/generate_parentheses.go +++ b/go/generate_parentheses.go @@ -1,7 +1,36 @@ //lint:file-ignore U1000 Ignore all unused code package main -func generateParenthesis(n int) []string { +func generateParenthesis_iterative(n int) []string { + var parentheses []string + type state struct { + parenthesis []byte + open int + closed int + } + stack := []state{{[]byte{}, 0, 0}} + for len(stack) > 0 { + current := stack[len(stack)-1] + stack = stack[:len(stack)-1] + if current.open == n && current.closed == n { + parentheses = append(parentheses, string(current.parenthesis)) + continue + } + if current.open < n { + newParenthesis := append([]byte{}, current.parenthesis...) + newParenthesis = append(newParenthesis, '(') + stack = append(stack, state{newParenthesis, current.open + 1, current.closed}) + } + if current.open > current.closed { + newParenthesis := append([]byte{}, current.parenthesis...) + newParenthesis = append(newParenthesis, ')') + stack = append(stack, state{newParenthesis, current.open, current.closed + 1}) + } + } + return parentheses +} + +func generateParenthesis_recursive(n int) []string { var parentheses []string parenthesis := make([]byte, 0, n*2) var generate func(int, int) From 2eb962d4d69e2fe6038e960fe62c9a9c16d07c34 Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 13 Aug 2024 17:04:59 +0900 Subject: [PATCH 253/396] fix func name to use camel case --- go/combination_sum.go | 6 +++--- go/contains_duplicate.go | 8 ++++++++ go/contains_duplicate_another_solution.go | 10 ---------- go/generate_parentheses.go | 4 ++-- go/permutations.go | 4 ++-- go/reverse_linked_list.go | 6 +++--- go/search_in_rotated_sorted_array.go | 4 ++-- go/symmetric_tree.go | 4 ++-- go/valid_anagram.go | 2 +- go/zigzag_conversion.go | 2 +- 10 files changed, 24 insertions(+), 26 deletions(-) delete mode 100644 go/contains_duplicate_another_solution.go diff --git a/go/combination_sum.go b/go/combination_sum.go index 50490e6..6ab9f70 100644 --- a/go/combination_sum.go +++ b/go/combination_sum.go @@ -1,7 +1,7 @@ //lint:file-ignore U1000 Ignore all unused code package main -func combinationSum_dp(candidates []int, target int) [][]int { +func combinationSumDP(candidates []int, target int) [][]int { combinationsGroups := make([][][]int, target+1) combinationsGroups[0] = [][]int{{}} for _, candidate := range candidates { @@ -16,7 +16,7 @@ func combinationSum_dp(candidates []int, target int) [][]int { return combinationsGroups[target] } -func combinationSum_backtracking_iterative(candidates []int, target int) [][]int { +func combinationSumBacktrackingIterative(candidates []int, target int) [][]int { combinations := [][]int{} type state struct { combination []int @@ -44,7 +44,7 @@ func combinationSum_backtracking_iterative(candidates []int, target int) [][]int return combinations } -func combinationSum_backtracking_recursion(candidates []int, target int) [][]int { +func combinationSumBacktrackingRecursion(candidates []int, target int) [][]int { var combinations [][]int var combination []int var generateCombinations func(int, int) diff --git a/go/contains_duplicate.go b/go/contains_duplicate.go index 8700cef..b216ac0 100644 --- a/go/contains_duplicate.go +++ b/go/contains_duplicate.go @@ -11,3 +11,11 @@ func containsDuplicate(nums []int) bool { } return false } + +func containsDuplicate2(nums []int) bool { + m := make(map[int]struct{}) + for _, n := range nums { + m[n] = struct{}{} + } + return len(nums) > len(m) +} diff --git a/go/contains_duplicate_another_solution.go b/go/contains_duplicate_another_solution.go deleted file mode 100644 index 873b3c6..0000000 --- a/go/contains_duplicate_another_solution.go +++ /dev/null @@ -1,10 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package main - -func containsDuplicate2(nums []int) bool { - m := make(map[int]struct{}) - for _, n := range nums { - m[n] = struct{}{} - } - return len(nums) > len(m) -} diff --git a/go/generate_parentheses.go b/go/generate_parentheses.go index 0cb6376..5bb6813 100644 --- a/go/generate_parentheses.go +++ b/go/generate_parentheses.go @@ -1,7 +1,7 @@ //lint:file-ignore U1000 Ignore all unused code package main -func generateParenthesis_iterative(n int) []string { +func generateParenthesisIterative(n int) []string { var parentheses []string type state struct { parenthesis []byte @@ -30,7 +30,7 @@ func generateParenthesis_iterative(n int) []string { return parentheses } -func generateParenthesis_recursive(n int) []string { +func generateParenthesisRecursive(n int) []string { var parentheses []string parenthesis := make([]byte, 0, n*2) var generate func(int, int) diff --git a/go/permutations.go b/go/permutations.go index 703f323..3e6c217 100644 --- a/go/permutations.go +++ b/go/permutations.go @@ -1,7 +1,7 @@ //lint:file-ignore U1000 Ignore all unused code package main -func permute_backtracking_iterative(nums []int) [][]int { +func permuteBacktrackingIterative(nums []int) [][]int { var permutations [][]int type state struct { permutation []int @@ -32,7 +32,7 @@ func permute_backtracking_iterative(nums []int) [][]int { return permutations } -func permute_backtracking_recursion(nums []int) [][]int { +func permuteBacktrackingRecursion(nums []int) [][]int { var permutations [][]int permutation := make([]int, 0, len(nums)) inUse := make(map[int]struct{}) diff --git a/go/reverse_linked_list.go b/go/reverse_linked_list.go index 7c6a3b1..0bd0747 100644 --- a/go/reverse_linked_list.go +++ b/go/reverse_linked_list.go @@ -1,7 +1,7 @@ //lint:file-ignore U1000 Ignore all unused code package main -func reverseList_iterative(head *ListNode) *ListNode { +func reverseListIterative(head *ListNode) *ListNode { curr := head var prev *ListNode for curr != nil { @@ -10,13 +10,13 @@ func reverseList_iterative(head *ListNode) *ListNode { return prev } -func reverseList_recurssive(head *ListNode) *ListNode { +func reverseListRecurssive(head *ListNode) *ListNode { curr := head if curr == nil || curr.Next == nil { return curr } next := curr.Next - reversedHead := reverseList_recurssive(next) + reversedHead := reverseListRecurssive(next) curr.Next, next.Next = nil, curr return reversedHead } diff --git a/go/search_in_rotated_sorted_array.go b/go/search_in_rotated_sorted_array.go index ff258d9..c8dac72 100644 --- a/go/search_in_rotated_sorted_array.go +++ b/go/search_in_rotated_sorted_array.go @@ -1,7 +1,7 @@ //lint:file-ignore U1000 Ignore all unused code package main -func search_closed(nums []int, target int) int { +func searchClosed(nums []int, target int) int { left, right := 0, len(nums)-1 for left <= right { mid := left + (right-left)/2 @@ -25,7 +25,7 @@ func search_closed(nums []int, target int) int { return -1 } -func search_half_closed(nums []int, target int) int { +func searchHalfClosed(nums []int, target int) int { left, right := 0, len(nums) for left < right { mid := left + (right-left)/2 diff --git a/go/symmetric_tree.go b/go/symmetric_tree.go index ea4b6a2..42c1cd2 100644 --- a/go/symmetric_tree.go +++ b/go/symmetric_tree.go @@ -3,7 +3,7 @@ package main import "container/list" -func isSymmetric_recursive(root *TreeNode) bool { +func isSymmetricRecursive(root *TreeNode) bool { if root == nil { return true } @@ -21,7 +21,7 @@ func isMirror(t1, t2 *TreeNode) bool { isMirror(t1.Left, t2.Right) && isMirror(t1.Right, t2.Left) } -func isSymmetric_iterative(root *TreeNode) bool { +func isSymmetricIterative(root *TreeNode) bool { if root == nil { return true } diff --git a/go/valid_anagram.go b/go/valid_anagram.go index 417df46..fae05ba 100644 --- a/go/valid_anagram.go +++ b/go/valid_anagram.go @@ -15,7 +15,7 @@ func frequency(s string) [26]int { // ちゃんとUnicodeに対応させるなら結合文字などを考慮する必要がある // https://github.com/rihib/leetcode/pull/5#discussion_r1706198268 -func isAnagram_unicode(s string, t string) bool { +func isAnagramUnicode(s string, t string) bool { frequency := make(map[rune]int) for _, r := range s { frequency[r]++ diff --git a/go/zigzag_conversion.go b/go/zigzag_conversion.go index 0747a7d..ec330f1 100644 --- a/go/zigzag_conversion.go +++ b/go/zigzag_conversion.go @@ -25,7 +25,7 @@ func convert(s string, numRows int) string { return oneline.String() } -func convert_anothersolution(s string, numRows int) string { +func convert2(s string, numRows int) string { if numRows == 1 { return s } From b34cbdabfd4499e6a6e8ade2753d051f9e84a17a Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 13 Aug 2024 18:16:58 +0900 Subject: [PATCH 254/396] add another solution for permutations --- go/permutations.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/go/permutations.go b/go/permutations.go index 3e6c217..e3e553d 100644 --- a/go/permutations.go +++ b/go/permutations.go @@ -1,6 +1,30 @@ //lint:file-ignore U1000 Ignore all unused code package main +import "sort" + +func permuteLexicographically(nums []int) [][]int { + sort.Ints(nums) + var permutations [][]int + for { + permutations = append(permutations, append([]int{}, nums...)) + i := len(nums) - 2 + for i >= 0 && nums[i] >= nums[i+1] { + i-- + } + if i < 0 { + break + } + j := len(nums) - 1 + for nums[j] <= nums[i] { + j-- + } + nums[i], nums[j] = nums[j], nums[i] + reverse(nums[i+1:]) + } + return permutations +} + func permuteBacktrackingIterative(nums []int) [][]int { var permutations [][]int type state struct { From c5225584ee568d7d70656dfdb1bf4d8141d6d3c2 Mon Sep 17 00:00:00 2001 From: rihib Date: Wed, 14 Aug 2024 14:17:41 +0900 Subject: [PATCH 255/396] create NumbersEveryoneShouldKnow.md --- NumbersEveryoneShouldKnow.md | 1 + README.md | 5 +---- code.txt | 0 3 files changed, 2 insertions(+), 4 deletions(-) create mode 100644 NumbersEveryoneShouldKnow.md delete mode 100644 code.txt diff --git a/NumbersEveryoneShouldKnow.md b/NumbersEveryoneShouldKnow.md new file mode 100644 index 0000000..239f5cd --- /dev/null +++ b/NumbersEveryoneShouldKnow.md @@ -0,0 +1 @@ +# Numbers Everyone Should Know diff --git a/README.md b/README.md index 7248dd2..0bb463f 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,6 @@ # leetcode -This repository contains / will contain the solutions to the problems on LeetCode. - -## Problem Sets +- [ ] [Arai 60](https://1kohei1.com/leetcode/) - [ ] [Grind 75](https://www.techinterviewhandbook.org/grind75) - [ ] [Blind 75](https://leetcode.com/discuss/general-discussion/460599/blind-75-leetcode-questions) -- [ ] [Arai 60](https://1kohei1.com/leetcode/) - [ ] [NeetCode 150](https://neetcode.io/) diff --git a/code.txt b/code.txt deleted file mode 100644 index e69de29..0000000 From cb968104206290902b2234e337d579232b4f0495 Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 15 Aug 2024 13:37:01 +0900 Subject: [PATCH 256/396] First Unique Character in a String --- go/first_unique_character_in_a_string.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 go/first_unique_character_in_a_string.go diff --git a/go/first_unique_character_in_a_string.go b/go/first_unique_character_in_a_string.go new file mode 100644 index 0000000..dbfa0b5 --- /dev/null +++ b/go/first_unique_character_in_a_string.go @@ -0,0 +1,15 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +func firstUniqChar(s string) int { + frequency := make(map[rune]int) + for _, r := range s { + frequency[r]++ + } + for i, r := range s { + if frequency[r] == 1 { + return i + } + } + return -1 +} From c7559284a5a2d2875ee740ec6826daaf1cfe8f66 Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 15 Aug 2024 14:14:00 +0900 Subject: [PATCH 257/396] add another solution for First Unique Character in a String --- go/first_unique_character_in_a_string.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/go/first_unique_character_in_a_string.go b/go/first_unique_character_in_a_string.go index dbfa0b5..12f238c 100644 --- a/go/first_unique_character_in_a_string.go +++ b/go/first_unique_character_in_a_string.go @@ -13,3 +13,16 @@ func firstUniqChar(s string) int { } return -1 } + +func firstUniqChar2(s string) int { + var frequency [26]int + for _, r := range s { + frequency[r-'a']++ + } + for i, r := range s { + if frequency[r-'a'] == 1 { + return i + } + } + return -1 +} From 6f01fa838427bd48941573d5baf3844a3901b125 Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 15 Aug 2024 23:34:23 +0900 Subject: [PATCH 258/396] Is Subsequence --- go/is_subsequence.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 go/is_subsequence.go diff --git a/go/is_subsequence.go b/go/is_subsequence.go new file mode 100644 index 0000000..6b531a5 --- /dev/null +++ b/go/is_subsequence.go @@ -0,0 +1,19 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +func isSubsequence(s string, t string) bool { + i := 0 + for _, r := range s { + for { + if i >= len(t) { + return false + } + if r == rune(t[i]) { + i++ + break + } + i++ + } + } + return true +} From 8d08d6df983f7119914f537eab6d460d18dbef8a Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 15 Aug 2024 23:37:13 +0900 Subject: [PATCH 259/396] refactor Is Subsequence --- go/is_subsequence.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/go/is_subsequence.go b/go/is_subsequence.go index 6b531a5..121f53b 100644 --- a/go/is_subsequence.go +++ b/go/is_subsequence.go @@ -2,17 +2,17 @@ package main func isSubsequence(s string, t string) bool { - i := 0 - for _, r := range s { + current := 0 + for i := 0; i < len(s); i++ { for { - if i >= len(t) { + if current >= len(t) { return false } - if r == rune(t[i]) { - i++ + if s[i] == t[current] { + current++ break } - i++ + current++ } } return true From 43fc2ff707a0e44912b877b9920577d11edf9038 Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 15 Aug 2024 23:41:59 +0900 Subject: [PATCH 260/396] refactor Is Subsequence --- go/is_subsequence.go | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/go/is_subsequence.go b/go/is_subsequence.go index 121f53b..20b3623 100644 --- a/go/is_subsequence.go +++ b/go/is_subsequence.go @@ -1,19 +1,15 @@ //lint:file-ignore U1000 Ignore all unused code package main -func isSubsequence(s string, t string) bool { +func isSubsequence2(s string, t string) bool { current := 0 - for i := 0; i < len(s); i++ { - for { - if current >= len(t) { - return false - } - if s[i] == t[current] { - current++ - break - } + for i := 0; i < len(t); i++ { + if s[current] == t[i] { current++ } + if current == len(s) { + return true + } } - return true + return false } From aa05df3fb5024e6bb95deddea317a96e84732b1c Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 15 Aug 2024 23:42:28 +0900 Subject: [PATCH 261/396] fix typo --- go/is_subsequence.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/is_subsequence.go b/go/is_subsequence.go index 20b3623..42d5fa0 100644 --- a/go/is_subsequence.go +++ b/go/is_subsequence.go @@ -1,7 +1,7 @@ //lint:file-ignore U1000 Ignore all unused code package main -func isSubsequence2(s string, t string) bool { +func isSubsequence(s string, t string) bool { current := 0 for i := 0; i < len(t); i++ { if s[current] == t[i] { From d2fca2aaf938317175d8b549a73233ba8d5ff002 Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 15 Aug 2024 23:45:27 +0900 Subject: [PATCH 262/396] fix typo --- go/is_subsequence.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/go/is_subsequence.go b/go/is_subsequence.go index 42d5fa0..ada0ef2 100644 --- a/go/is_subsequence.go +++ b/go/is_subsequence.go @@ -2,6 +2,9 @@ package main func isSubsequence(s string, t string) bool { + if len(s) == 0 { + return true + } current := 0 for i := 0; i < len(t); i++ { if s[current] == t[i] { From 2642db49db05064637040876ac069b774896fe52 Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 15 Aug 2024 23:50:05 +0900 Subject: [PATCH 263/396] refactor Is Subsequence --- go/is_subsequence.go | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/go/is_subsequence.go b/go/is_subsequence.go index ada0ef2..306c2cb 100644 --- a/go/is_subsequence.go +++ b/go/is_subsequence.go @@ -2,17 +2,12 @@ package main func isSubsequence(s string, t string) bool { - if len(s) == 0 { - return true - } - current := 0 - for i := 0; i < len(t); i++ { - if s[current] == t[i] { - current++ - } - if current == len(s) { - return true + i, j := 0, 0 + for i < len(s) && j < len(t) { + if s[i] == t[j] { + i++ } + j++ } - return false + return i == len(s) } From 06a4fb148e7934c055029a9c413c5b34e82e7d1c Mon Sep 17 00:00:00 2001 From: rihib Date: Fri, 16 Aug 2024 15:53:01 +0900 Subject: [PATCH 264/396] Word Break --- go/word_break.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 go/word_break.go diff --git a/go/word_break.go b/go/word_break.go new file mode 100644 index 0000000..7f460fd --- /dev/null +++ b/go/word_break.go @@ -0,0 +1,18 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +func wordBreak(s string, wordDict []string) bool { + canBreak := make([]bool, len(s)+1) + canBreak[len(s)] = true + for i := len(s) - 1; i >= 0; i-- { + for _, w := range wordDict { + if (i+len(w)) <= len(s) && s[i:i+len(w)] == w { + canBreak[i] = canBreak[i+len(w)] + } + if canBreak[i] { + break + } + } + } + return canBreak[0] +} From 7be44914c187eebb91fa6b41240695efe59acf69 Mon Sep 17 00:00:00 2001 From: rihib Date: Fri, 16 Aug 2024 18:35:56 +0900 Subject: [PATCH 265/396] refactor Word Break --- go/word_break.go | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/go/word_break.go b/go/word_break.go index 7f460fd..e468d04 100644 --- a/go/word_break.go +++ b/go/word_break.go @@ -3,16 +3,14 @@ package main func wordBreak(s string, wordDict []string) bool { canBreak := make([]bool, len(s)+1) - canBreak[len(s)] = true - for i := len(s) - 1; i >= 0; i-- { + canBreak[0] = true + for i := 1; i <= len(s); i++ { for _, w := range wordDict { - if (i+len(w)) <= len(s) && s[i:i+len(w)] == w { - canBreak[i] = canBreak[i+len(w)] - } - if canBreak[i] { + if i >= len(w) && canBreak[i-len(w)] && s[i-len(w):i] == w { + canBreak[i] = true break } } } - return canBreak[0] + return canBreak[len(s)] } From 17f19f643953997050c49b632e35b408526d7fb4 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 17 Aug 2024 11:14:00 +0900 Subject: [PATCH 266/396] refactor Top K Frequent Elements --- go/top_k_frequent_elements.go | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/go/top_k_frequent_elements.go b/go/top_k_frequent_elements.go index 81dacc5..f1e7e54 100644 --- a/go/top_k_frequent_elements.go +++ b/go/top_k_frequent_elements.go @@ -2,22 +2,20 @@ package main func topKFrequent(nums []int, k int) []int { - freq := make(map[int]int) - for _, n := range nums { - freq[n]++ + frequency := make(map[int]int) + for _, num := range nums { + frequency[num]++ } - - cs := make([][]int, len(nums)) - for n, c := range freq { - cs[c-1] = append(cs[c-1], n) + countToNum := make([][]int, len(nums)+1) + for num, count := range frequency { + countToNum[count] = append(countToNum[count], num) } - - var res []int - for i := len(cs) - 1; i >= 0; i-- { - res = append(res, cs[i]...) - if len(res) >= k { + var topK []int + for i := len(countToNum) - 1; i >= 0; i-- { + topK = append(topK, countToNum[i]...) + if len(topK) >= k { break } } - return res + return topK } From bba68f78d968ebce81d13d0ae8ff429e217177f1 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 17 Aug 2024 16:26:19 +0900 Subject: [PATCH 267/396] refactor Top K Frequent Elements --- go/top_k_frequent_elements.go | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/go/top_k_frequent_elements.go b/go/top_k_frequent_elements.go index f1e7e54..ba2c02d 100644 --- a/go/top_k_frequent_elements.go +++ b/go/top_k_frequent_elements.go @@ -1,7 +1,7 @@ //lint:file-ignore U1000 Ignore all unused code package main -func topKFrequent(nums []int, k int) []int { +func topKFrequentBucketSort(nums []int, k int) []int { frequency := make(map[int]int) for _, num := range nums { frequency[num]++ @@ -10,12 +10,9 @@ func topKFrequent(nums []int, k int) []int { for num, count := range frequency { countToNum[count] = append(countToNum[count], num) } - var topK []int - for i := len(countToNum) - 1; i >= 0; i-- { + topK := make([]int, 0, k) + for i := len(countToNum) - 1; i >= 0 && len(topK) < k; i-- { topK = append(topK, countToNum[i]...) - if len(topK) >= k { - break - } } return topK } From 2b8cc572369a6941f2094fcd30a599f77e42e02a Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 17 Aug 2024 16:27:42 +0900 Subject: [PATCH 268/396] add Quickselect version for Top K Frequent Elements --- go/top_k_frequent_elements.go | 82 +++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/go/top_k_frequent_elements.go b/go/top_k_frequent_elements.go index ba2c02d..f0d9e5d 100644 --- a/go/top_k_frequent_elements.go +++ b/go/top_k_frequent_elements.go @@ -1,6 +1,15 @@ //lint:file-ignore U1000 Ignore all unused code package main +import ( + "math/rand/v2" +) + +type Element struct { + num int + count int +} + func topKFrequentBucketSort(nums []int, k int) []int { frequency := make(map[int]int) for _, num := range nums { @@ -16,3 +25,76 @@ func topKFrequentBucketSort(nums []int, k int) []int { } return topK } + +func topKFrequentQuickselect(nums []int, k int) []int { + frequency := make(map[int]int) + for _, num := range nums { + frequency[num]++ + } + elements := make([]Element, 0, len(frequency)) + for num, count := range frequency { + elements = append(elements, Element{num: num, count: count}) + } + quickselect(elements, 0, len(elements)-1, len(elements)-k, partitionRandom) + topK := make([]int, k) + for i := 0; i < k; i++ { + topK[i] = elements[len(elements)-1-i].num + } + return topK +} + +func quickselect( + elements []Element, left, right, k int, + partition func([]Element, int, int) int) { + for left < right { + pivotIndex := partition(elements, left, right) + if pivotIndex == k { + return + } + if pivotIndex < k { + left = pivotIndex + 1 + } else { + right = pivotIndex - 1 + } + } +} + +func partitionRandom(elements []Element, left, right int) int { + pivotIndex := left + rand.IntN(right-left+1) + elements[pivotIndex], elements[right] = elements[right], elements[pivotIndex] + pivot := elements[right].count + storeIndex := left + for i := left; i < right; i++ { + if elements[i].count < pivot { + elements[i], elements[storeIndex] = elements[storeIndex], elements[i] + storeIndex++ + } + } + elements[storeIndex], elements[right] = elements[right], elements[storeIndex] + return storeIndex +} + +func partitionMedianOf3(elements []Element, left, right int) int { + mid := left + (right-left)/2 + if elements[right].count < elements[left].count { + elements[right], elements[left] = elements[left], elements[right] + } + if elements[mid].count < elements[left].count { + elements[mid], elements[left] = elements[left], elements[mid] + } + if elements[right].count < elements[mid].count { + elements[right], elements[mid] = elements[mid], elements[right] + } + pivotIndex := mid + elements[pivotIndex], elements[right] = elements[right], elements[pivotIndex] + pivot := elements[right].count + storeIndex := left + for i := left; i < right; i++ { + if elements[i].count < pivot { + elements[i], elements[storeIndex] = elements[storeIndex], elements[i] + storeIndex++ + } + } + elements[storeIndex], elements[right] = elements[right], elements[storeIndex] + return storeIndex +} From 6d8ff0d6b2e3960b8bd7d1ebcad639f8cb2ea5d0 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 17 Aug 2024 16:28:23 +0900 Subject: [PATCH 269/396] add PDQ sort version for Top K Frequent Elements --- go/top_k_frequent_elements.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/go/top_k_frequent_elements.go b/go/top_k_frequent_elements.go index f0d9e5d..482734c 100644 --- a/go/top_k_frequent_elements.go +++ b/go/top_k_frequent_elements.go @@ -3,6 +3,7 @@ package main import ( "math/rand/v2" + "sort" ) type Element struct { @@ -98,3 +99,18 @@ func partitionMedianOf3(elements []Element, left, right int) int { elements[storeIndex], elements[right] = elements[right], elements[storeIndex] return storeIndex } + +func topKFrequentPDQSort(nums []int, k int) []int { + frequency := make(map[int]int) + for _, num := range nums { + frequency[num]++ + } + numsSet := make([]int, 0, len(frequency)) + for num := range frequency { + numsSet = append(numsSet, num) + } + sort.Slice(numsSet, func(i, j int) bool { + return frequency[numsSet[i]] > frequency[numsSet[j]] + }) + return numsSet[:k] +} From 864cc4103f8051662ff19b2eb2e86c68ece11508 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 17 Aug 2024 16:29:04 +0900 Subject: [PATCH 270/396] add Min Heap version for Top K Frequent Elements --- go/top_k_frequent_elements.go | 37 +++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/go/top_k_frequent_elements.go b/go/top_k_frequent_elements.go index 482734c..959a34f 100644 --- a/go/top_k_frequent_elements.go +++ b/go/top_k_frequent_elements.go @@ -2,6 +2,7 @@ package main import ( + "container/heap" "math/rand/v2" "sort" ) @@ -114,3 +115,39 @@ func topKFrequentPDQSort(nums []int, k int) []int { }) return numsSet[:k] } + +func topKFrequentMinHeap(nums []int, k int) []int { + frequency := make(map[int]int) + for _, num := range nums { + frequency[num]++ + } + h := &MinHeap{} + heap.Init(h) + for num, count := range frequency { + heap.Push(h, Element{num: num, count: count}) + if h.Len() > k { + heap.Pop(h) + } + } + topK := make([]int, 0, k) + for h.Len() > 0 { + topK = append(topK, heap.Pop(h).(Element).num) + } + return topK +} + +type MinHeap []Element + +func (h *MinHeap) Push(x interface{}) { + *h = append(*h, x.(Element)) +} + +func (h *MinHeap) Pop() interface{} { + x := (*h)[len(*h)-1] + *h = (*h)[0 : len(*h)-1] + return x +} + +func (h MinHeap) Len() int { return len(h) } +func (h MinHeap) Less(i, j int) bool { return h[i].count < h[j].count } +func (h MinHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] } From 4f022ba0a9cb4f7633f89570c24894a5d74c2e39 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 17 Aug 2024 16:29:40 +0900 Subject: [PATCH 271/396] add Max Heap version of Top K Frequent Elements --- go/top_k_frequent_elements.go | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/go/top_k_frequent_elements.go b/go/top_k_frequent_elements.go index 959a34f..47369ca 100644 --- a/go/top_k_frequent_elements.go +++ b/go/top_k_frequent_elements.go @@ -151,3 +151,36 @@ func (h *MinHeap) Pop() interface{} { func (h MinHeap) Len() int { return len(h) } func (h MinHeap) Less(i, j int) bool { return h[i].count < h[j].count } func (h MinHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] } + +func topKFrequentMaxHeap(nums []int, k int) []int { + frequency := make(map[int]int) + for _, num := range nums { + frequency[num]++ + } + h := &MaxHeap{} + heap.Init(h) + for num, count := range frequency { + heap.Push(h, Element{num: num, count: count}) + } + topK := make([]int, 0, k) + for i := 0; i < k; i++ { + topK = append(topK, heap.Pop(h).(Element).num) + } + return topK +} + +type MaxHeap []Element + +func (h *MaxHeap) Push(x interface{}) { + *h = append(*h, x.(Element)) +} + +func (h *MaxHeap) Pop() interface{} { + x := (*h)[len(*h)-1] + *h = (*h)[0 : len(*h)-1] + return x +} + +func (h MaxHeap) Len() int { return len(h) } +func (h MaxHeap) Less(i, j int) bool { return h[i].count > h[j].count } +func (h MaxHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] } From a35d3ce17bdf3662a07c8b787bafbb5be2d9e477 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 17 Aug 2024 22:08:20 +0900 Subject: [PATCH 272/396] add another solution for Product of Array Except Self --- go/product_of_array_except_self.go | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/go/product_of_array_except_self.go b/go/product_of_array_except_self.go index 5760107..d75bf4a 100644 --- a/go/product_of_array_except_self.go +++ b/go/product_of_array_except_self.go @@ -18,3 +18,31 @@ func productExceptSelf(nums []int) []int { return res } + +func productExceptSelf2(nums []int) []int { + allProduct, zeroCount := 0, 0 + for _, n := range nums { + if n == 0 { + zeroCount++ + continue + } + if allProduct == 0 { + allProduct = n + } else { + allProduct *= n + } + } + products := make([]int, len(nums)) + for i, _ := range products { + if zeroCount > 0 { + if nums[i] == 0 && zeroCount == 1 { + products[i] = allProduct + } else { + products[i] = 0 + } + } else { + products[i] = allProduct / nums[i] + } + } + return products +} From fdeb2bc9af595a30c07d5761953d7721cd64a2b1 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 17 Aug 2024 22:36:10 +0900 Subject: [PATCH 273/396] refactor Product of Array Except Self --- go/product_of_array_except_self.go | 35 ++++++++++++++---------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/go/product_of_array_except_self.go b/go/product_of_array_except_self.go index d75bf4a..c167e8c 100644 --- a/go/product_of_array_except_self.go +++ b/go/product_of_array_except_self.go @@ -2,24 +2,6 @@ package main func productExceptSelf(nums []int) []int { - res := make([]int, len(nums)) - - lp := 1 - for i := 0; i < len(nums); i++ { - res[i] = lp - lp *= nums[i] - } - - rp := 1 - for i := len(nums) - 1; i >= 0; i-- { - res[i] *= rp - rp *= nums[i] - } - - return res -} - -func productExceptSelf2(nums []int) []int { allProduct, zeroCount := 0, 0 for _, n := range nums { if n == 0 { @@ -33,7 +15,7 @@ func productExceptSelf2(nums []int) []int { } } products := make([]int, len(nums)) - for i, _ := range products { + for i := range products { if zeroCount > 0 { if nums[i] == 0 && zeroCount == 1 { products[i] = allProduct @@ -46,3 +28,18 @@ func productExceptSelf2(nums []int) []int { } return products } + +func productExceptSelf2(nums []int) []int { + products := make([]int, len(nums)) + leftProduct := 1 + for i := 0; i < len(nums); i++ { + products[i] = leftProduct + leftProduct *= nums[i] + } + rightProduct := 1 + for i := len(nums) - 1; i >= 0; i-- { + products[i] *= rightProduct + rightProduct *= nums[i] + } + return products +} From dcab5a80ffe24d6b39774c8a4852ec2ff439cc30 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 17 Aug 2024 22:45:05 +0900 Subject: [PATCH 274/396] fix --- go/product_of_array_except_self.go | 28 ---------------------------- 1 file changed, 28 deletions(-) diff --git a/go/product_of_array_except_self.go b/go/product_of_array_except_self.go index c167e8c..e820c2a 100644 --- a/go/product_of_array_except_self.go +++ b/go/product_of_array_except_self.go @@ -2,34 +2,6 @@ package main func productExceptSelf(nums []int) []int { - allProduct, zeroCount := 0, 0 - for _, n := range nums { - if n == 0 { - zeroCount++ - continue - } - if allProduct == 0 { - allProduct = n - } else { - allProduct *= n - } - } - products := make([]int, len(nums)) - for i := range products { - if zeroCount > 0 { - if nums[i] == 0 && zeroCount == 1 { - products[i] = allProduct - } else { - products[i] = 0 - } - } else { - products[i] = allProduct / nums[i] - } - } - return products -} - -func productExceptSelf2(nums []int) []int { products := make([]int, len(nums)) leftProduct := 1 for i := 0; i < len(nums); i++ { From 6fe0a8c87efde2bf8815b6fa42bd2615832d7b38 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 17 Aug 2024 22:48:45 +0900 Subject: [PATCH 275/396] pullrequests/product_of_array_except_self --- .../product_of_array_except_self/step1.go | 35 +++++++++++++++++++ .../product_of_array_except_self/step2.go | 20 +++++++++++ 2 files changed, 55 insertions(+) create mode 100644 pullrequests/product_of_array_except_self/step1.go create mode 100644 pullrequests/product_of_array_except_self/step2.go diff --git a/pullrequests/product_of_array_except_self/step1.go b/pullrequests/product_of_array_except_self/step1.go new file mode 100644 index 0000000..dd80caa --- /dev/null +++ b/pullrequests/product_of_array_except_self/step1.go @@ -0,0 +1,35 @@ +//lint:file-ignore U1000 Ignore all unused code +package template + +/* +時間:6分 +全体の積を求め、個々の数字で割ることで求める。 +解いた後に割り算を使ってはいけないということに気づいた。 +*/ +func productExceptSelfStep1(nums []int) []int { + allProduct, zeroCount := 0, 0 + for _, n := range nums { + if n == 0 { + zeroCount++ + continue + } + if allProduct == 0 { + allProduct = n + } else { + allProduct *= n + } + } + products := make([]int, len(nums)) + for i := range products { + if zeroCount > 0 { + if nums[i] == 0 && zeroCount == 1 { + products[i] = allProduct + } else { + products[i] = 0 + } + } else { + products[i] = allProduct / nums[i] + } + } + return products +} diff --git a/pullrequests/product_of_array_except_self/step2.go b/pullrequests/product_of_array_except_self/step2.go new file mode 100644 index 0000000..864039e --- /dev/null +++ b/pullrequests/product_of_array_except_self/step2.go @@ -0,0 +1,20 @@ +//lint:file-ignore U1000 Ignore all unused code +package template + +/* +他の人の解法を見て書いた。 +*/ +func productExceptSelfStep2(nums []int) []int { + products := make([]int, len(nums)) + leftProduct := 1 + for i := 0; i < len(nums); i++ { + products[i] = leftProduct + leftProduct *= nums[i] + } + rightProduct := 1 + for i := len(nums) - 1; i >= 0; i-- { + products[i] *= rightProduct + rightProduct *= nums[i] + } + return products +} From b7edd06024ddeffbb9e3f8961b465eb7e71a6789 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 31 Aug 2024 00:24:39 +0900 Subject: [PATCH 276/396] refactor Longest Consecutive Sequence --- go/longest_consecutive_sequence.go | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/go/longest_consecutive_sequence.go b/go/longest_consecutive_sequence.go index d975908..574b697 100644 --- a/go/longest_consecutive_sequence.go +++ b/go/longest_consecutive_sequence.go @@ -2,26 +2,24 @@ package main func longestConsecutive(nums []int) int { - m := make(map[int]struct{}) + numsMap := make(map[int]struct{}, len(nums)) for _, n := range nums { - m[n] = struct{}{} + numsMap[n] = struct{}{} } - - maxLen := 0 - for n := range m { - if _, ok := m[n-1]; ok { + maxLength := 0 + for _, n := range nums { + if _, ok := numsMap[n-1]; ok { continue } - - for l := 1; ; l++ { - if _, ok := m[n+l]; !ok { - if l > maxLen { - maxLen = l - } + length := 1 + for { + n++ + if _, ok := numsMap[n]; !ok { break } + length++ } + maxLength = max(maxLength, length) } - - return maxLen + return maxLength } From 4479de8f8f359a010395eca52228e00c583c44d5 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 31 Aug 2024 00:39:56 +0900 Subject: [PATCH 277/396] refactor Longest Consecutive Sequence --- go/longest_consecutive_sequence.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/go/longest_consecutive_sequence.go b/go/longest_consecutive_sequence.go index 574b697..2c50337 100644 --- a/go/longest_consecutive_sequence.go +++ b/go/longest_consecutive_sequence.go @@ -7,7 +7,7 @@ func longestConsecutive(nums []int) int { numsMap[n] = struct{}{} } maxLength := 0 - for _, n := range nums { + for n := range numsMap { if _, ok := numsMap[n-1]; ok { continue } @@ -18,6 +18,7 @@ func longestConsecutive(nums []int) int { break } length++ + delete(numsMap, n) } maxLength = max(maxLength, length) } From 4791fcd7d44a03003740a84118b2f50be9cf4723 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 31 Aug 2024 14:59:50 +0900 Subject: [PATCH 278/396] refactor Valid Parentheses --- go/valid_parentheses.go | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/go/valid_parentheses.go b/go/valid_parentheses.go index d83cdbb..409326a 100644 --- a/go/valid_parentheses.go +++ b/go/valid_parentheses.go @@ -2,22 +2,18 @@ package main func isValid(s string) bool { - p := map[rune]rune{')': '(', '}': '{', ']': '['} var stack []rune - - for _, r := range s { - v, ok := p[r] - + brackets := map[rune]rune{')': '(', '}': '{', ']': '['} + for _, bracket := range s { + openBracket, ok := brackets[bracket] if !ok { - stack = append(stack, r) + stack = append(stack, bracket) continue } - - if len(stack) < 1 || stack[len(stack)-1] != v { + if len(stack) == 0 || stack[len(stack)-1] != openBracket { return false } stack = stack[:len(stack)-1] } - return len(stack) == 0 } From e253fd8625ee9667006d67d5980becfa91afffb8 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 31 Aug 2024 15:27:53 +0900 Subject: [PATCH 279/396] refactor Valid Parentheses --- go/valid_parentheses.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/go/valid_parentheses.go b/go/valid_parentheses.go index 409326a..7231e5e 100644 --- a/go/valid_parentheses.go +++ b/go/valid_parentheses.go @@ -3,9 +3,9 @@ package main func isValid(s string) bool { var stack []rune - brackets := map[rune]rune{')': '(', '}': '{', ']': '['} + closeToOpens := map[rune]rune{')': '(', '}': '{', ']': '['} for _, bracket := range s { - openBracket, ok := brackets[bracket] + openBracket, ok := closeToOpens[bracket] if !ok { stack = append(stack, bracket) continue From 63a52df3a28c89093a3b0e1390754f445d5ab2f2 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 31 Aug 2024 19:25:11 +0900 Subject: [PATCH 280/396] refactor Best Time to Buy and Sell Stock --- go/best_time_to_buy_and_sell_stock.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/go/best_time_to_buy_and_sell_stock.go b/go/best_time_to_buy_and_sell_stock.go index 6e8ecf8..e094efa 100644 --- a/go/best_time_to_buy_and_sell_stock.go +++ b/go/best_time_to_buy_and_sell_stock.go @@ -2,10 +2,10 @@ package main func maxProfit(prices []int) int { - lowestPrice, highestProfit := prices[0], 0 - for _, n := range prices { - lowestPrice = min(lowestPrice, n) - highestProfit = max(highestProfit, n-lowestPrice) + minPrice, maxProfit := prices[0], 0 + for _, price := range prices { + minPrice = min(minPrice, price) + maxProfit = max(maxProfit, price-minPrice) } - return highestProfit + return maxProfit } From f26655e6bd45ce07c7ed519943fc52c545e2cfe6 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 31 Aug 2024 19:27:10 +0900 Subject: [PATCH 281/396] refactor Best Time to Buy and Sell Stock --- go/best_time_to_buy_and_sell_stock.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/go/best_time_to_buy_and_sell_stock.go b/go/best_time_to_buy_and_sell_stock.go index e094efa..34d8a4e 100644 --- a/go/best_time_to_buy_and_sell_stock.go +++ b/go/best_time_to_buy_and_sell_stock.go @@ -2,10 +2,10 @@ package main func maxProfit(prices []int) int { - minPrice, maxProfit := prices[0], 0 + minPrice, maxValue := prices[0], 0 for _, price := range prices { minPrice = min(minPrice, price) - maxProfit = max(maxProfit, price-minPrice) + maxValue = max(maxValue, price-minPrice) } - return maxProfit + return maxValue } From 052363484ce6bdc00be47c766a9307b330cbe7eb Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 31 Aug 2024 19:41:17 +0900 Subject: [PATCH 282/396] refactor Best Time to Buy and Sell Stock --- go/best_time_to_buy_and_sell_stock.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/go/best_time_to_buy_and_sell_stock.go b/go/best_time_to_buy_and_sell_stock.go index 34d8a4e..63c3509 100644 --- a/go/best_time_to_buy_and_sell_stock.go +++ b/go/best_time_to_buy_and_sell_stock.go @@ -1,8 +1,10 @@ //lint:file-ignore U1000 Ignore all unused code package main +import "math" + func maxProfit(prices []int) int { - minPrice, maxValue := prices[0], 0 + minPrice, maxValue := math.MaxInt, 0 for _, price := range prices { minPrice = min(minPrice, price) maxValue = max(maxValue, price-minPrice) From 7e4755afa1c28a6d15f8bfdf1f847638d7809522 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 31 Aug 2024 19:46:52 +0900 Subject: [PATCH 283/396] pullrequests/best_time_to_buy_and_sell_stock --- .../best_time_to_buy_and_sell_stock/step1.go | 18 ++++++++++++++++++ .../best_time_to_buy_and_sell_stock/step2.go | 16 ++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 pullrequests/best_time_to_buy_and_sell_stock/step1.go create mode 100644 pullrequests/best_time_to_buy_and_sell_stock/step2.go diff --git a/pullrequests/best_time_to_buy_and_sell_stock/step1.go b/pullrequests/best_time_to_buy_and_sell_stock/step1.go new file mode 100644 index 0000000..ad300d9 --- /dev/null +++ b/pullrequests/best_time_to_buy_and_sell_stock/step1.go @@ -0,0 +1,18 @@ +//lint:file-ignore U1000 Ignore all unused code +package besttimetobuyandsellstock + +/* +時間:4分30秒 + +走査している中で現在の値に対して最大の利益を取り得るのは今まで走査してきた中の最小値であるため、最小値を更新した後に、現在の値に対する利益を計算し、それが最大値であれば更新するようにしている。 + +解いた後に中の変数名と関数名が一緒になってしまっていることに気づいた。 +*/ +func maxProfitStep1(prices []int) int { + minPrice, maxValue := prices[0], 0 + for _, price := range prices { + minPrice = min(minPrice, price) + maxValue = max(maxValue, price-minPrice) + } + return maxValue +} diff --git a/pullrequests/best_time_to_buy_and_sell_stock/step2.go b/pullrequests/best_time_to_buy_and_sell_stock/step2.go new file mode 100644 index 0000000..bb7f7c4 --- /dev/null +++ b/pullrequests/best_time_to_buy_and_sell_stock/step2.go @@ -0,0 +1,16 @@ +//lint:file-ignore U1000 Ignore all unused code +package besttimetobuyandsellstock + +import "math" + +/* +関数名と被らないように変数名を更新したのと、minPriceをmath.MaxIntで初期化することで、たとえ空の入力が渡されたとしてもエラーにならないようにした。 +*/ +func maxProfit(prices []int) int { + minPrice, maxValue := math.MaxInt, 0 + for _, price := range prices { + minPrice = min(minPrice, price) + maxValue = max(maxValue, price-minPrice) + } + return maxValue +} From 4d621aeea3fc8aedc0ac29db378b25f2f28b3b57 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 1 Sep 2024 17:17:22 +0900 Subject: [PATCH 284/396] refactor Valid Palindrome --- go/valid_palindrome.go | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/go/valid_palindrome.go b/go/valid_palindrome.go index 1d3dbdb..e93c2d8 100644 --- a/go/valid_palindrome.go +++ b/go/valid_palindrome.go @@ -4,21 +4,19 @@ package main import "unicode" func isPalindrome(s string) bool { - r := []rune(s) - for i, j := 0, len(r)-1; i < j; { - if !(unicode.IsLetter(r[i]) || unicode.IsDigit(r[i])) { + sRunes := []rune(s) + for i, j := 0, len(s)-1; i < j; { + if !(unicode.IsDigit(sRunes[i]) || unicode.IsLetter(sRunes[i])) { i++ continue } - if !(unicode.IsLetter(r[j]) || unicode.IsDigit(r[j])) { + if !(unicode.IsDigit(sRunes[j]) || unicode.IsLetter(sRunes[j])) { j-- continue } - - if unicode.ToLower(r[i]) != unicode.ToLower(r[j]) { + if unicode.ToLower(sRunes[i]) != unicode.ToLower(sRunes[j]) { return false } - i++ j-- } From 6213849052212355f634566cf7f3ae3a34a8d52e Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 1 Sep 2024 17:28:50 +0900 Subject: [PATCH 285/396] refactor Valid Palindrome --- go/valid_palindrome.go | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/go/valid_palindrome.go b/go/valid_palindrome.go index e93c2d8..22a0315 100644 --- a/go/valid_palindrome.go +++ b/go/valid_palindrome.go @@ -4,21 +4,22 @@ package main import "unicode" func isPalindrome(s string) bool { - sRunes := []rune(s) - for i, j := 0, len(s)-1; i < j; { - if !(unicode.IsDigit(sRunes[i]) || unicode.IsLetter(sRunes[i])) { - i++ + runeS := []rune(s) + left, right := 0, len(s)-1 + for left < right { + if !(unicode.IsDigit(runeS[left]) || unicode.IsLetter(runeS[left])) { + left++ continue } - if !(unicode.IsDigit(sRunes[j]) || unicode.IsLetter(sRunes[j])) { - j-- + if !(unicode.IsDigit(runeS[right]) || unicode.IsLetter(runeS[right])) { + right-- continue } - if unicode.ToLower(sRunes[i]) != unicode.ToLower(sRunes[j]) { + if unicode.ToLower(runeS[left]) != unicode.ToLower(runeS[right]) { return false } - i++ - j-- + left++ + right-- } return true } From 344a72ef3d6cd6dc48b6e91013e9e73a5a2acc8e Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 1 Sep 2024 18:22:22 +0900 Subject: [PATCH 286/396] add another solution of Invert Binary Tree --- go/invert_binary_tree.go | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/go/invert_binary_tree.go b/go/invert_binary_tree.go index b63eb53..161dc76 100644 --- a/go/invert_binary_tree.go +++ b/go/invert_binary_tree.go @@ -1,9 +1,28 @@ //lint:file-ignore U1000 Ignore all unused code package main -func invertTree(root *TreeNode) *TreeNode { +func invertTreeRecursive(root *TreeNode) *TreeNode { if root != nil { - root.Left, root.Right = invertTree(root.Right), invertTree(root.Left) + root.Left, root.Right = invertTreeRecursive(root.Right), invertTreeRecursive(root.Left) + } + return root +} + +func invertTreeIterative(root *TreeNode) *TreeNode { + if root == nil { + return nil + } + stack := []*TreeNode{root} + for len(stack) > 0 { + node := stack[len(stack)-1] + stack = stack[:len(stack)-1] + node.Left, node.Right = node.Right, node.Left + if node.Left != nil { + stack = append(stack, node.Left) + } + if node.Right != nil { + stack = append(stack, node.Right) + } } return root } From 4437af52afc2289101c35027028cf5e9891df849 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 1 Sep 2024 18:24:31 +0900 Subject: [PATCH 287/396] pullrequests/invert_binary_tree --- pullrequests/invert_binary_tree/step1.go | 23 +++++++++++++++++ pullrequests/invert_binary_tree/step2.go | 33 ++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 pullrequests/invert_binary_tree/step1.go create mode 100644 pullrequests/invert_binary_tree/step2.go diff --git a/pullrequests/invert_binary_tree/step1.go b/pullrequests/invert_binary_tree/step1.go new file mode 100644 index 0000000..baae19d --- /dev/null +++ b/pullrequests/invert_binary_tree/step1.go @@ -0,0 +1,23 @@ +//lint:file-ignore U1000 Ignore all unused code +package invertbinarytree + +type TreeNode struct { + Val int + Left *TreeNode + Right *TreeNode +} + +/* +時間:3分30秒 + +再帰的に左右のノードを入れ替えていけば良いというのにはすぐに気づき、すんなり実装することができた。 +*/ +func invertTreeStep1(root *TreeNode) *TreeNode { + if root == nil { + return nil + } + invertTreeStep1(root.Left) + invertTreeStep1(root.Right) + root.Left, root.Right = root.Right, root.Left + return root +} diff --git a/pullrequests/invert_binary_tree/step2.go b/pullrequests/invert_binary_tree/step2.go new file mode 100644 index 0000000..8b4171c --- /dev/null +++ b/pullrequests/invert_binary_tree/step2.go @@ -0,0 +1,33 @@ +//lint:file-ignore U1000 Ignore all unused code +package invertbinarytree + +/* +Step1は冗長だったのでリファクタした。 +これぐらい短いと早期リターンしなくても良いかなと思い下記のようにしました。 +またイテレーティブに解く方法も実装しました。 +*/ +func invertTreeStep2(root *TreeNode) *TreeNode { + if root != nil { + root.Left, root.Right = invertTreeStep2(root.Right), invertTreeStep2(root.Left) + } + return root +} + +func invertTreeIterative(root *TreeNode) *TreeNode { + if root == nil { + return nil + } + stack := []*TreeNode{root} + for len(stack) > 0 { + node := stack[len(stack)-1] + stack = stack[:len(stack)-1] + node.Left, node.Right = node.Right, node.Left + if node.Left != nil { + stack = append(stack, node.Left) + } + if node.Right != nil { + stack = append(stack, node.Right) + } + } + return root +} From f4d1e4b74fda5630cf43c939d7fd09ca71a99333 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 2 Sep 2024 22:23:38 +0900 Subject: [PATCH 288/396] refactor Binary Search --- go/binary_search.go | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/go/binary_search.go b/go/binary_search.go index 0ed0356..4291b70 100644 --- a/go/binary_search.go +++ b/go/binary_search.go @@ -1,21 +1,34 @@ //lint:file-ignore U1000 Ignore all unused code package main -func search(nums []int, target int) int { - l, r := 0, len(nums)-1 - for l <= r { - mid := l + (r-l)/2 - - if target == nums[mid] { +func binarySearchHalfClosed(nums []int, target int) int { + left, right := 0, len(nums) + for left < right { + mid := left + (right-left)/2 + if nums[mid] == target { return mid } - if target < nums[mid] { - r = mid - 1 + right = mid } else { - l = mid + 1 + left = mid + 1 } } + return -1 +} +func binarySearchClosed(nums []int, target int) int { + left, right := 0, len(nums)-1 + for left <= right { + mid := left + (right-left)/2 + if nums[mid] == target { + return mid + } + if target < nums[mid] { + right = mid - 1 + } else { + left = mid + 1 + } + } return -1 } From 532d73b1c1f6309da9a5915c655ff1b152420285 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 2 Sep 2024 23:32:55 +0900 Subject: [PATCH 289/396] add another solution of Binary Search --- go/binary_search.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/go/binary_search.go b/go/binary_search.go index 4291b70..812ad11 100644 --- a/go/binary_search.go +++ b/go/binary_search.go @@ -1,6 +1,8 @@ //lint:file-ignore U1000 Ignore all unused code package main +import "sort" + func binarySearchHalfClosed(nums []int, target int) int { left, right := 0, len(nums) for left < right { @@ -32,3 +34,13 @@ func binarySearchClosed(nums []int, target int) int { } return -1 } + +func search(nums []int, target int) int { + index := sort.Search(len(nums), func(i int) bool { + return nums[i] >= target + }) + if index < len(nums) && nums[index] == target { + return index + } + return -1 +} From 1b5f30cfd3d8ba46b6d5e19723d95280d1ff4ab7 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 2 Sep 2024 23:36:51 +0900 Subject: [PATCH 290/396] pullrequests/binary_search --- pullrequests/binary_search/step1.go | 38 +++++++++++++++++++++++++++++ pullrequests/binary_search/step2.go | 17 +++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 pullrequests/binary_search/step1.go create mode 100644 pullrequests/binary_search/step2.go diff --git a/pullrequests/binary_search/step1.go b/pullrequests/binary_search/step1.go new file mode 100644 index 0000000..6c6300f --- /dev/null +++ b/pullrequests/binary_search/step1.go @@ -0,0 +1,38 @@ +//lint:file-ignore U1000 Ignore all unused code +package binarysearch + +/* +時間:5分 +単なる二分探索だが、まだ少し実装がもたつく部分があり、体に定着するほどにはなっていないなと思いました。 +*/ +func binarySearchHalfClosed(nums []int, target int) int { + left, right := 0, len(nums) + for left < right { + mid := left + (right-left)/2 + if nums[mid] == target { + return mid + } + if target < nums[mid] { + right = mid + } else { + left = mid + 1 + } + } + return -1 +} + +func binarySearchClosed(nums []int, target int) int { + left, right := 0, len(nums)-1 + for left <= right { + mid := left + (right-left)/2 + if nums[mid] == target { + return mid + } + if target < nums[mid] { + right = mid - 1 + } else { + left = mid + 1 + } + } + return -1 +} diff --git a/pullrequests/binary_search/step2.go b/pullrequests/binary_search/step2.go new file mode 100644 index 0000000..27e6a7d --- /dev/null +++ b/pullrequests/binary_search/step2.go @@ -0,0 +1,17 @@ +//lint:file-ignore U1000 Ignore all unused code +package binarysearch + +import "sort" + +/* +PythonのbisectみたいなものがGoにもないかと調べたところ、sort.Search関数が使えそうだったので実装してみました。 +*/ +func search(nums []int, target int) int { + index := sort.Search(len(nums), func(i int) bool { + return nums[i] >= target + }) + if index < len(nums) && nums[index] == target { + return index + } + return -1 +} From 140dc35889e42140b0e365acc4ff9c419467d937 Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 3 Sep 2024 00:07:43 +0900 Subject: [PATCH 291/396] refactor Flood Fill --- go/flood_fill.go | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/go/flood_fill.go b/go/flood_fill.go index c744357..b04df29 100644 --- a/go/flood_fill.go +++ b/go/flood_fill.go @@ -3,21 +3,16 @@ package main func floodFill(image [][]int, sr int, sc int, color int) [][]int { originalColor := image[sr][sc] - if originalColor == color { return image } image[sr][sc] = color - - directions := [][]int{{-1, 0}, {1, 0}, {0, -1}, {0, 1}} - for _, d := range directions { - nSr, nSc := sr+d[0], sc+d[1] - if 0 <= nSr && nSr < len(image) && - 0 <= nSc && nSc < len(image[0]) && - image[nSr][nSc] == originalColor { - image = floodFill(image, nSr, nSc, color) + directions := [][]int{{0, 1}, {0, -1}, {1, 0}, {-1, 0}} + for _, direction := range directions { + newSr, newSc := sr+direction[0], sc+direction[1] + if 0 <= newSr && newSr < len(image) && 0 <= newSc && newSc < len(image[0]) && image[newSr][newSc] == originalColor { + floodFill(image, newSr, newSc, color) } } - return image } From ef711b73487f5f07a4710a6053fc0a5193181e2e Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 3 Sep 2024 13:01:52 +0900 Subject: [PATCH 292/396] add another solution of Lowest Common Ancestor of a Binary Search Tree --- ...common_ancester_of_a_binary_search_tree.go | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/go/lowest_common_ancester_of_a_binary_search_tree.go b/go/lowest_common_ancester_of_a_binary_search_tree.go index af2a5a4..0eb2b6c 100644 --- a/go/lowest_common_ancester_of_a_binary_search_tree.go +++ b/go/lowest_common_ancester_of_a_binary_search_tree.go @@ -1,14 +1,28 @@ //lint:file-ignore U1000 Ignore all unused code package main -func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode { - if p.Val < root.Val && q.Val < root.Val { - return lowestCommonAncestor(root.Left, p, q) +func lowestCommonAncestorIterative(root, p, q *TreeNode) *TreeNode { + node := root + for node != nil { + if p.Val <= node.Val && node.Val <= q.Val || q.Val <= node.Val && node.Val <= p.Val { + return node + } + if p.Val < node.Val && q.Val < node.Val { + node = node.Left + } + if node.Val < p.Val && node.Val < q.Val { + node = node.Right + } } + return nil +} +func lowestCommonAncestorRecursive(root, p, q *TreeNode) *TreeNode { + if p.Val < root.Val && q.Val < root.Val { + return lowestCommonAncestorRecursive(root.Left, p, q) + } if root.Val < p.Val && root.Val < q.Val { - return lowestCommonAncestor(root.Right, p, q) + return lowestCommonAncestorRecursive(root.Right, p, q) } - return root } From 6e134be9ab6b15ce9bed4c106ecd139b58c674d1 Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 3 Sep 2024 13:03:47 +0900 Subject: [PATCH 293/396] refactor Lowest Common Ancestor of a Binary Search Tree --- go/lowest_common_ancester_of_a_binary_search_tree.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/go/lowest_common_ancester_of_a_binary_search_tree.go b/go/lowest_common_ancester_of_a_binary_search_tree.go index 0eb2b6c..d2211bf 100644 --- a/go/lowest_common_ancester_of_a_binary_search_tree.go +++ b/go/lowest_common_ancester_of_a_binary_search_tree.go @@ -4,15 +4,15 @@ package main func lowestCommonAncestorIterative(root, p, q *TreeNode) *TreeNode { node := root for node != nil { - if p.Val <= node.Val && node.Val <= q.Val || q.Val <= node.Val && node.Val <= p.Val { - return node - } if p.Val < node.Val && q.Val < node.Val { node = node.Left + continue } if node.Val < p.Val && node.Val < q.Val { node = node.Right + continue } + return node } return nil } From c89a1c7e548913f6e2a5d40b196c879c197bf3d4 Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 3 Sep 2024 13:17:05 +0900 Subject: [PATCH 294/396] pullrequests/lowest_common_ancester_of_a_binary_search_tree --- .../step1.go | 31 ++++++++++++++++++ .../step2.go | 32 +++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 pullrequests/lowest_common_ancester_of_a_binary_search_tree/step1.go create mode 100644 pullrequests/lowest_common_ancester_of_a_binary_search_tree/step2.go diff --git a/pullrequests/lowest_common_ancester_of_a_binary_search_tree/step1.go b/pullrequests/lowest_common_ancester_of_a_binary_search_tree/step1.go new file mode 100644 index 0000000..db07c2b --- /dev/null +++ b/pullrequests/lowest_common_ancester_of_a_binary_search_tree/step1.go @@ -0,0 +1,31 @@ +//lint:file-ignore U1000 Ignore all unused code +package lowestcommonancesterofabinarysearchtree + +type TreeNode struct { + Val int + Left *TreeNode + Right *TreeNode +} + +/* +時間:6分30秒 + +ルートから見ていく時、共通の祖先になっていないときは必ず、pとqは左か右のどちらかの同じ部分木にいるはず。pとqの間の値になったら共通の祖先になったとわかる。 + +本来は見つからなかった場合は返り値としてerrorを返したかったのですが、LeetCodeの制約上変えられないのでnilを返すようにしています。 +*/ +func lowestCommonAncestorIterativeStep1(root, p, q *TreeNode) *TreeNode { + node := root + for node != nil { + if p.Val <= node.Val && node.Val <= q.Val || q.Val <= node.Val && node.Val <= p.Val { + return node + } + if p.Val < node.Val && q.Val < node.Val { + node = node.Left + } + if node.Val < p.Val && node.Val < q.Val { + node = node.Right + } + } + return nil +} diff --git a/pullrequests/lowest_common_ancester_of_a_binary_search_tree/step2.go b/pullrequests/lowest_common_ancester_of_a_binary_search_tree/step2.go new file mode 100644 index 0000000..9c72e0b --- /dev/null +++ b/pullrequests/lowest_common_ancester_of_a_binary_search_tree/step2.go @@ -0,0 +1,32 @@ +//lint:file-ignore U1000 Ignore all unused code +package lowestcommonancesterofabinarysearchtree + +/* +より見やすくなるようにリファクタしました。また、再帰を使った実装もしてみました。 +エラー処理についてはStep1と同様です。 +*/ +func lowestCommonAncestorIterative(root, p, q *TreeNode) *TreeNode { + node := root + for node != nil { + if p.Val < node.Val && q.Val < node.Val { + node = node.Left + continue + } + if node.Val < p.Val && node.Val < q.Val { + node = node.Right + continue + } + return node + } + return nil +} + +func lowestCommonAncestorRecursive(root, p, q *TreeNode) *TreeNode { + if p.Val < root.Val && q.Val < root.Val { + return lowestCommonAncestorRecursive(root.Left, p, q) + } + if root.Val < p.Val && root.Val < q.Val { + return lowestCommonAncestorRecursive(root.Right, p, q) + } + return root +} From 79fd1fce53e6d29ea8c984c63549957a1695d37c Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 3 Sep 2024 13:35:09 +0900 Subject: [PATCH 295/396] pullrequests/lowest_common_ancester_of_a_binary_search_tree --- .../lowest_common_ancester_of_a_binary_search_tree/step1.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pullrequests/lowest_common_ancester_of_a_binary_search_tree/step1.go b/pullrequests/lowest_common_ancester_of_a_binary_search_tree/step1.go index db07c2b..109c01b 100644 --- a/pullrequests/lowest_common_ancester_of_a_binary_search_tree/step1.go +++ b/pullrequests/lowest_common_ancester_of_a_binary_search_tree/step1.go @@ -13,6 +13,11 @@ type TreeNode struct { ルートから見ていく時、共通の祖先になっていないときは必ず、pとqは左か右のどちらかの同じ部分木にいるはず。pとqの間の値になったら共通の祖先になったとわかる。 本来は見つからなかった場合は返り値としてerrorを返したかったのですが、LeetCodeの制約上変えられないのでnilを返すようにしています。 + +該当ノードが見つからなかったからといってプログラムの実行の継続が困難になるわけではないと思うので、panicやlog.Panicを使うのはやり過ぎだと思います。 +場合によっては絶対に見つからないことが起こる入力はしないはずだと言える状況であればlog.Fatalを使ってログに書き込んだ後にos.Exit(1)を呼び出してプログラムを終了させるのが良い可能性もありますが、それも通常の場合やりすぎな気がします。 +他にはlog.Printなどを使ってログに見つからなかったことを記録しても良いかもしれませんが、見つからないことが起こる入力があり得るのであれば単にerrorを返り値として返して呼び出し側で処理するのが良いと思っています。 +他には単に見つからなかった場合はnilを返すなども手としてはあると思いますが、そうする場合は呼び出し側にもわかるようにコメント等で書いておいて欲しいなと思います。 */ func lowestCommonAncestorIterativeStep1(root, p, q *TreeNode) *TreeNode { node := root From 763e7946e7deba4424175ed356ae0f67b41d2140 Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 3 Sep 2024 14:00:17 +0900 Subject: [PATCH 296/396] refactor Balanced Binary Tree --- go/balanced_binary_tree.go | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/go/balanced_binary_tree.go b/go/balanced_binary_tree.go index f82ca12..919980a 100644 --- a/go/balanced_binary_tree.go +++ b/go/balanced_binary_tree.go @@ -4,22 +4,21 @@ package main import "math" type TreeBalance struct { - IsBalanced bool - Height int + isBalanced bool + height int } func isBalanced(root *TreeNode) bool { - return checkBalance(root).IsBalanced + return checkBalance(root).isBalanced } -func checkBalance(root *TreeNode) TreeBalance { +func checkBalance(root *TreeNode) *TreeBalance { if root == nil { - return TreeBalance{true, 0} + return &TreeBalance{true, 0} } - - l, r := checkBalance(root.Left), checkBalance(root.Right) - b := l.IsBalanced && r.IsBalanced && - math.Abs(float64(l.Height-r.Height)) <= 1.0 - h := max(l.Height, r.Height) + 1 - return TreeBalance{b, h} + left, right := checkBalance(root.Left), checkBalance(root.Right) + isBalanced := left.isBalanced && right.isBalanced && + math.Abs(float64(left.height-right.height)) <= 1.0 + height := max(left.height, right.height) + 1 + return &TreeBalance{isBalanced, height} } From 1025e06f39fb3db27dd73d599f5a22a38cbc9e6c Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 3 Sep 2024 14:32:29 +0900 Subject: [PATCH 297/396] refactor Balanced Binary Tree --- go/balanced_binary_tree.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/go/balanced_binary_tree.go b/go/balanced_binary_tree.go index 919980a..15d5409 100644 --- a/go/balanced_binary_tree.go +++ b/go/balanced_binary_tree.go @@ -3,7 +3,7 @@ package main import "math" -type TreeBalance struct { +type treeBalance struct { isBalanced bool height int } @@ -12,13 +12,13 @@ func isBalanced(root *TreeNode) bool { return checkBalance(root).isBalanced } -func checkBalance(root *TreeNode) *TreeBalance { +func checkBalance(root *TreeNode) treeBalance { if root == nil { - return &TreeBalance{true, 0} + return treeBalance{true, 0} } left, right := checkBalance(root.Left), checkBalance(root.Right) isBalanced := left.isBalanced && right.isBalanced && math.Abs(float64(left.height-right.height)) <= 1.0 height := max(left.height, right.height) + 1 - return &TreeBalance{isBalanced, height} + return treeBalance{isBalanced, height} } From 15a283cdfe9ee75746ad9aaae149a46688616f55 Mon Sep 17 00:00:00 2001 From: rihib Date: Fri, 6 Sep 2024 09:13:26 +0900 Subject: [PATCH 298/396] refactor Linked List Cycle --- go/linked_list_cycle.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/go/linked_list_cycle.go b/go/linked_list_cycle.go index bb9cf4e..95afc02 100644 --- a/go/linked_list_cycle.go +++ b/go/linked_list_cycle.go @@ -3,10 +3,10 @@ package main // `https://github.com/ryo-devz/LeetCode/pull/1#discussion_r1710718113`に書かれているとおり、印をつける方法はデメリットが大きい func hasCycle(head *ListNode) bool { - fast, slow := head, head + slow, fast := head, head for fast != nil && fast.Next != nil { - fast, slow = fast.Next.Next, slow.Next - if fast == slow { + slow, fast = slow.Next, fast.Next.Next + if slow == fast { return true } } From 0b7820af5fb4fcd09f9ce9b47938b2204bd5155a Mon Sep 17 00:00:00 2001 From: rihib Date: Fri, 6 Sep 2024 09:32:16 +0900 Subject: [PATCH 299/396] add another solution of Linked List Cycle --- go/linked_list_cycle.go | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/go/linked_list_cycle.go b/go/linked_list_cycle.go index 95afc02..3d51207 100644 --- a/go/linked_list_cycle.go +++ b/go/linked_list_cycle.go @@ -2,7 +2,7 @@ package main // `https://github.com/ryo-devz/LeetCode/pull/1#discussion_r1710718113`に書かれているとおり、印をつける方法はデメリットが大きい -func hasCycle(head *ListNode) bool { +func hasCycleFloyd(head *ListNode) bool { slow, fast := head, head for fast != nil && fast.Next != nil { slow, fast = slow.Next, fast.Next.Next @@ -12,3 +12,16 @@ func hasCycle(head *ListNode) bool { } return false } + +func hasCycleMap(head *ListNode) bool { + seen := make(map[*ListNode]struct{}) + node := head + for node != nil { + if _, ok := seen[node]; ok { + return true + } + seen[node] = struct{}{} + node = node.Next + } + return false +} From 787c43c20a53009fd017c2b3377226fb76cb0537 Mon Sep 17 00:00:00 2001 From: rihib Date: Fri, 6 Sep 2024 09:41:50 +0900 Subject: [PATCH 300/396] update template --- pullrequests/template/step1.go | 5 +++++ pullrequests/template/step2.go | 5 +++++ pullrequests/template/step3.go | 5 +++++ 3 files changed, 15 insertions(+) diff --git a/pullrequests/template/step1.go b/pullrequests/template/step1.go index b0c1012..063fb3a 100644 --- a/pullrequests/template/step1.go +++ b/pullrequests/template/step1.go @@ -1,6 +1,11 @@ //lint:file-ignore U1000 Ignore all unused code package template +/* +レビュワーの方へ: + - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 +*/ + /* COMMENT */ diff --git a/pullrequests/template/step2.go b/pullrequests/template/step2.go index b0c1012..063fb3a 100644 --- a/pullrequests/template/step2.go +++ b/pullrequests/template/step2.go @@ -1,6 +1,11 @@ //lint:file-ignore U1000 Ignore all unused code package template +/* +レビュワーの方へ: + - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 +*/ + /* COMMENT */ diff --git a/pullrequests/template/step3.go b/pullrequests/template/step3.go index b0c1012..063fb3a 100644 --- a/pullrequests/template/step3.go +++ b/pullrequests/template/step3.go @@ -1,6 +1,11 @@ //lint:file-ignore U1000 Ignore all unused code package template +/* +レビュワーの方へ: + - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 +*/ + /* COMMENT */ From 0df2b0fc607c7e7f93a237ddc84637806d1448d1 Mon Sep 17 00:00:00 2001 From: rihib Date: Fri, 6 Sep 2024 09:57:01 +0900 Subject: [PATCH 301/396] refactor Linked List Cycle --- go/linked_list_cycle.go | 1 - 1 file changed, 1 deletion(-) diff --git a/go/linked_list_cycle.go b/go/linked_list_cycle.go index 3d51207..7b42eeb 100644 --- a/go/linked_list_cycle.go +++ b/go/linked_list_cycle.go @@ -1,7 +1,6 @@ //lint:file-ignore U1000 Ignore all unused code package main -// `https://github.com/ryo-devz/LeetCode/pull/1#discussion_r1710718113`に書かれているとおり、印をつける方法はデメリットが大きい func hasCycleFloyd(head *ListNode) bool { slow, fast := head, head for fast != nil && fast.Next != nil { From 808207c39ea21d8a9af4105527d2d52e4a06e646 Mon Sep 17 00:00:00 2001 From: rihib Date: Fri, 6 Sep 2024 10:03:07 +0900 Subject: [PATCH 302/396] pullrequests/linked_list_cycle --- pullrequests/linked_list_cycle/step1.go | 29 +++++++++++++++++++++++++ pullrequests/linked_list_cycle/step2.go | 24 ++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 pullrequests/linked_list_cycle/step1.go create mode 100644 pullrequests/linked_list_cycle/step2.go diff --git a/pullrequests/linked_list_cycle/step1.go b/pullrequests/linked_list_cycle/step1.go new file mode 100644 index 0000000..3ac8934 --- /dev/null +++ b/pullrequests/linked_list_cycle/step1.go @@ -0,0 +1,29 @@ +//lint:file-ignore U1000 Ignore all unused code +package linkedlistcycle + +type ListNode struct { + Val int + Next *ListNode +} + +/* +レビュワーの方へ: + - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 +*/ + +/* +時間:5分 + +この問題を見たことがあり、フロイドの循環検出法を知っていたため、その方法で解いてみた。 +`slow == fast`ではポインタ同士を比較しているため、同一のオブジェクトであることを確認できる。 +*/ +func hasCycleFloyd(head *ListNode) bool { + slow, fast := head, head + for fast != nil && fast.Next != nil { + slow, fast = slow.Next, fast.Next.Next + if slow == fast { + return true + } + } + return false +} diff --git a/pullrequests/linked_list_cycle/step2.go b/pullrequests/linked_list_cycle/step2.go new file mode 100644 index 0000000..8bfb50b --- /dev/null +++ b/pullrequests/linked_list_cycle/step2.go @@ -0,0 +1,24 @@ +//lint:file-ignore U1000 Ignore all unused code +package linkedlistcycle + +/* +レビュワーの方へ: + - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 +*/ + +/* +他に既に訪ねたノードのリストを保持しておく方法も考えられる。 +ノードのポインタ(メモリアドレス)をキーとしている。 +*/ +func hasCycleMap(head *ListNode) bool { + seen := make(map[*ListNode]struct{}) + node := head + for node != nil { + if _, ok := seen[node]; ok { + return true + } + seen[node] = struct{}{} + node = node.Next + } + return false +} From f3c33b46632a3b8440b499f4d4bedfc6e5abcf3b Mon Sep 17 00:00:00 2001 From: rihib Date: Fri, 6 Sep 2024 10:09:48 +0900 Subject: [PATCH 303/396] refactor Linked List Cycle --- go/linked_list_cycle.go | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/go/linked_list_cycle.go b/go/linked_list_cycle.go index 7b42eeb..e8cd286 100644 --- a/go/linked_list_cycle.go +++ b/go/linked_list_cycle.go @@ -1,17 +1,6 @@ //lint:file-ignore U1000 Ignore all unused code package main -func hasCycleFloyd(head *ListNode) bool { - slow, fast := head, head - for fast != nil && fast.Next != nil { - slow, fast = slow.Next, fast.Next.Next - if slow == fast { - return true - } - } - return false -} - func hasCycleMap(head *ListNode) bool { seen := make(map[*ListNode]struct{}) node := head @@ -24,3 +13,14 @@ func hasCycleMap(head *ListNode) bool { } return false } + +func hasCycleFloyd(head *ListNode) bool { + slow, fast := head, head + for fast != nil && fast.Next != nil { + slow, fast = slow.Next, fast.Next.Next + if slow == fast { + return true + } + } + return false +} From 683df75796d096ffd41b74d725771cde02e5f12f Mon Sep 17 00:00:00 2001 From: rihib Date: Fri, 6 Sep 2024 15:05:06 +0900 Subject: [PATCH 304/396] refactor Implement Queue using Stacks --- go/implement_queue_using_stacks.go | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/go/implement_queue_using_stacks.go b/go/implement_queue_using_stacks.go index fa7be02..fa2c849 100644 --- a/go/implement_queue_using_stacks.go +++ b/go/implement_queue_using_stacks.go @@ -1,35 +1,36 @@ //lint:file-ignore U1000 Ignore all unused code package main +// `implement_queue_using_stacks2.go`に実際に書く場合のコードを記載 type MyQueue struct { - InputStack []int - OutputStack []int + pushStack []int + popStack []int } func Constructor() MyQueue { return MyQueue{} } -func (q *MyQueue) Push(x int) { - q.InputStack = append(q.InputStack, x) +func (q *MyQueue) Push(n int) { + q.pushStack = append(q.pushStack, n) } func (q *MyQueue) Pop() int { - x := q.Peek() - q.OutputStack = q.OutputStack[:len(q.OutputStack)-1] - return x + n := q.Peek() + q.popStack = q.popStack[:len(q.popStack)-1] + return n } func (q *MyQueue) Peek() int { - if len(q.OutputStack) == 0 { - for len(q.InputStack) > 0 { - q.OutputStack = append(q.OutputStack, q.InputStack[len(q.InputStack)-1]) - q.InputStack = q.InputStack[:len(q.InputStack)-1] + if len(q.popStack) == 0 { + for len(q.pushStack) > 0 { + q.popStack = append(q.popStack, q.pushStack[len(q.pushStack)-1]) + q.pushStack = q.pushStack[:len(q.pushStack)-1] } } - return q.OutputStack[len(q.OutputStack)-1] + return q.popStack[len(q.popStack)-1] } func (q *MyQueue) Empty() bool { - return len(q.InputStack) == 0 && len(q.OutputStack) == 0 + return len(q.pushStack) == 0 && len(q.popStack) == 0 } From cb19f909d37ff7edfe53386e85040e0f27b7e272 Mon Sep 17 00:00:00 2001 From: rihib Date: Fri, 6 Sep 2024 15:05:15 +0900 Subject: [PATCH 305/396] Implement Queue using Stacks 2 --- go/implement_queue_using_stacks2.go | 39 +++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 go/implement_queue_using_stacks2.go diff --git a/go/implement_queue_using_stacks2.go b/go/implement_queue_using_stacks2.go new file mode 100644 index 0000000..57087e2 --- /dev/null +++ b/go/implement_queue_using_stacks2.go @@ -0,0 +1,39 @@ +//lint:file-ignore U1000 Ignore all unused code +package main + +import "fmt" + +type Queue struct { + pushStack []int + popStack []int +} + +func (q *Queue) Push(n int) { + q.pushStack = append(q.pushStack, n) +} + +func (q *Queue) Pop() (int, error) { + n, err := q.Peek() + if err != nil { + return 0, fmt.Errorf("queue is empty, cannot pop") + } + q.popStack = q.popStack[:len(q.popStack)-1] + return n, nil +} + +func (q *Queue) Peek() (int, error) { + if q.Empty() { + return 0, fmt.Errorf("queue is empty, cannot peek") + } + if len(q.popStack) == 0 { + for len(q.pushStack) > 0 { + q.popStack = append(q.popStack, q.pushStack[len(q.pushStack)-1]) + q.pushStack = q.pushStack[:len(q.pushStack)-1] + } + } + return q.popStack[len(q.popStack)-1], nil +} + +func (q *Queue) Empty() bool { + return len(q.pushStack) == 0 && len(q.popStack) == 0 +} From f4b3bb506b3aca3a74d81274bd57088875d5f201 Mon Sep 17 00:00:00 2001 From: rihib Date: Fri, 6 Sep 2024 15:21:36 +0900 Subject: [PATCH 306/396] pullrequests/implement_queue_using_stacks --- .../implement_queue_using_stacks/step1.go | 57 +++++++++++++++++++ .../implement_queue_using_stacks/step2.go | 43 ++++++++++++++ .../implement_queue_using_stacks/step3.go | 47 +++++++++++++++ 3 files changed, 147 insertions(+) create mode 100644 pullrequests/implement_queue_using_stacks/step1.go create mode 100644 pullrequests/implement_queue_using_stacks/step2.go create mode 100644 pullrequests/implement_queue_using_stacks/step3.go diff --git a/pullrequests/implement_queue_using_stacks/step1.go b/pullrequests/implement_queue_using_stacks/step1.go new file mode 100644 index 0000000..0ebd590 --- /dev/null +++ b/pullrequests/implement_queue_using_stacks/step1.go @@ -0,0 +1,57 @@ +//lint:file-ignore U1000 Ignore all unused code +package template + +/* +レビュワーの方へ: + - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 +*/ + +/* +時間:15分 + +スタックを2つ使ってキューを実装する方法を知っていたので解法自体はすぐに思いついた。 +LeetCodeの問題としてはPopやPeekは必ず有効な時に呼ばれるとのことなので、エラー処理をする必要はなく、プロトタイプ宣言自体もerrorを返せるようになっていないが、個人的にエラー処理をしないと気持ち悪かったので、変なエラー処理っぽいことをした中途半端なコードになってしまった。 + +末尾についているStep1は提出用につけただけなので無視してください。 +*/ +type MyQueueStep1 struct { + pushStack []int + popStack []int +} + +func ConstructorStep1() MyQueueStep1 { + var q MyQueueStep1 + return q +} + +func (this *MyQueueStep1) Push(x int) { + this.pushStack = append(this.pushStack, x) +} + +func (this *MyQueueStep1) Pop() int { + this.Peek() + if len(this.popStack) > 0 { + x := this.popStack[len(this.popStack)-1] + this.popStack = this.popStack[:len(this.popStack)-1] + return x + } + return 0 +} + +func (this *MyQueueStep1) Peek() int { + if len(this.popStack) <= 0 { + for len(this.pushStack) > 0 { + x := this.pushStack[len(this.pushStack)-1] + this.pushStack = this.pushStack[:len(this.pushStack)-1] + this.popStack = append(this.popStack, x) + } + } + if len(this.popStack) > 0 { + return this.popStack[len(this.popStack)-1] + } + return 0 +} + +func (this *MyQueueStep1) Empty() bool { + return len(this.pushStack) <= 0 && len(this.popStack) <= 0 +} diff --git a/pullrequests/implement_queue_using_stacks/step2.go b/pullrequests/implement_queue_using_stacks/step2.go new file mode 100644 index 0000000..0a2be0e --- /dev/null +++ b/pullrequests/implement_queue_using_stacks/step2.go @@ -0,0 +1,43 @@ +//lint:file-ignore U1000 Ignore all unused code +package template + +/* +レビュワーの方へ: + - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 +*/ + +/* +LeetCodeに通すことだけを考えてちゃんと綺麗に書いてみた。 +*/ +type MyQueueStep2 struct { + pushStack []int + popStack []int +} + +func ConstructorStep2() MyQueueStep2 { + return MyQueueStep2{} +} + +func (q *MyQueueStep2) Push(n int) { + q.pushStack = append(q.pushStack, n) +} + +func (q *MyQueueStep2) Pop() int { + n := q.Peek() + q.popStack = q.popStack[:len(q.popStack)-1] + return n +} + +func (q *MyQueueStep2) Peek() int { + if len(q.popStack) == 0 { + for len(q.pushStack) > 0 { + q.popStack = append(q.popStack, q.pushStack[len(q.pushStack)-1]) + q.pushStack = q.pushStack[:len(q.pushStack)-1] + } + } + return q.popStack[len(q.popStack)-1] +} + +func (q *MyQueueStep2) Empty() bool { + return len(q.pushStack) == 0 && len(q.popStack) == 0 +} diff --git a/pullrequests/implement_queue_using_stacks/step3.go b/pullrequests/implement_queue_using_stacks/step3.go new file mode 100644 index 0000000..f149e83 --- /dev/null +++ b/pullrequests/implement_queue_using_stacks/step3.go @@ -0,0 +1,47 @@ +//lint:file-ignore U1000 Ignore all unused code +package template + +import "fmt" + +/* +レビュワーの方へ: + - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 +*/ + +/* +実際にLeetCodeの制約を無視できる場合のコードも書いてみた(本来であれば`container/list`を使えば良いという話だが、そこは一応LeetCodeで提示されている形から極力変えずに書いた)。 +*/ +type Queue struct { + pushStack []int + popStack []int +} + +func (q *Queue) Push(n int) { + q.pushStack = append(q.pushStack, n) +} + +func (q *Queue) Pop() (int, error) { + n, err := q.Peek() + if err != nil { + return 0, fmt.Errorf("queue is empty, cannot pop") + } + q.popStack = q.popStack[:len(q.popStack)-1] + return n, nil +} + +func (q *Queue) Peek() (int, error) { + if q.Empty() { + return 0, fmt.Errorf("queue is empty, cannot peek") + } + if len(q.popStack) == 0 { + for len(q.pushStack) > 0 { + q.popStack = append(q.popStack, q.pushStack[len(q.pushStack)-1]) + q.pushStack = q.pushStack[:len(q.pushStack)-1] + } + } + return q.popStack[len(q.popStack)-1], nil +} + +func (q *Queue) Empty() bool { + return len(q.pushStack) == 0 && len(q.popStack) == 0 +} From 21a26840b414b784b01826a488e8dec59dc296b0 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 7 Sep 2024 16:34:56 +0900 Subject: [PATCH 307/396] refactor First Bad Version --- go/first_bad_version.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/go/first_bad_version.go b/go/first_bad_version.go index 39bd6fc..56a94ab 100644 --- a/go/first_bad_version.go +++ b/go/first_bad_version.go @@ -8,14 +8,14 @@ func isBadVersion(version int) bool { } func firstBadVersion(n int) int { - l, r := 1, n - for l < r { - mid := l + (r-l)/2 + left, right := 1, n+1 + for left < right { + mid := left + (right-left)/2 if isBadVersion(mid) { - r = mid + right = mid } else { - l = mid + 1 + left = mid + 1 } } - return l + return left } From bd49e64c6fcd148185b0713fafc83f3d42f490c2 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 7 Sep 2024 16:38:17 +0900 Subject: [PATCH 308/396] add another solution of First Bad Version --- go/first_bad_version.go | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/go/first_bad_version.go b/go/first_bad_version.go index 56a94ab..2036e52 100644 --- a/go/first_bad_version.go +++ b/go/first_bad_version.go @@ -7,7 +7,7 @@ func isBadVersion(version int) bool { return version == BadVersion } -func firstBadVersion(n int) int { +func firstBadVersionHalfClosed(n int) int { left, right := 1, n+1 for left < right { mid := left + (right-left)/2 @@ -19,3 +19,16 @@ func firstBadVersion(n int) int { } return left } + +func firstBadVersionClosed(n int) int { + left, right := 1, n + for left <= right { + mid := left + (right-left)/2 + if isBadVersion(mid) { + right = mid - 1 + } else { + left = mid + 1 + } + } + return left +} From a869367db7c301234117b22d7e0e6f73204f5bd5 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 7 Sep 2024 20:06:49 +0900 Subject: [PATCH 309/396] add another solution of Binary Search --- go/binary_search.go | 69 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/go/binary_search.go b/go/binary_search.go index 812ad11..8ebf67e 100644 --- a/go/binary_search.go +++ b/go/binary_search.go @@ -19,7 +19,58 @@ func binarySearchHalfClosed(nums []int, target int) int { return -1 } -func binarySearchClosed(nums []int, target int) int { +func binarySearchHalfClosed2(nums []int, target int) int { + left, right := 0, len(nums) + for { + if left == right { + break + } + mid := left + (right-left)/2 + if nums[mid] == target { + return mid + } + if target < nums[mid] { + right = mid + } else { + left = mid + 1 + } + } + return -1 +} + +func binarySearchHalfClosed3(nums []int, target int) int { + left, right := 0, len(nums) + for left < right { + mid := left + (right-left)/2 + if nums[mid] < target { + left = mid + 1 + } else { + right = mid + } + } + if left >= len(nums) || nums[left] != target { + return -1 + } + return left +} + +func binarySearchHalfClosed4(nums []int, target int) int { + left, right := 0, len(nums) + for left < right { + mid := left + (right-left)/2 + if nums[mid] < target { + left = mid + 1 + } else { + right = mid + } + } + if right >= len(nums) || nums[right] != target { + return -1 + } + return right +} + +func binarySearchClosed1(nums []int, target int) int { left, right := 0, len(nums)-1 for left <= right { mid := left + (right-left)/2 @@ -35,6 +86,22 @@ func binarySearchClosed(nums []int, target int) int { return -1 } +func binarySearchClosed2(nums []int, target int) int { + left, right := 0, len(nums)-1 + for left <= right { + mid := left + (right-left)/2 + if nums[mid] < target { + left = mid + 1 + } else { + right = mid - 1 + } + } + if left >= len(nums) || nums[left] != target { + return -1 + } + return left +} + func search(nums []int, target int) int { index := sort.Search(len(nums), func(i int) bool { return nums[i] >= target From f7d4facded8384395faed2542ae1130a6ae3485e Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 9 Sep 2024 23:30:58 +0900 Subject: [PATCH 310/396] refactor Ransom Note --- go/ransom_note.go | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/go/ransom_note.go b/go/ransom_note.go index 196f2f7..63cafd5 100644 --- a/go/ransom_note.go +++ b/go/ransom_note.go @@ -2,15 +2,13 @@ package main func canConstruct(ransomNote string, magazine string) bool { - var freq [26]int - + var frequency [26]int for _, r := range magazine { - freq[r-'a']++ + frequency[r-'a']++ } - for _, r := range ransomNote { - freq[r-'a']-- - if freq[r-'a'] < 0 { + frequency[r-'a']-- + if frequency[r-'a'] < 0 { return false } } From e4bf01c0eef53f4bf8a89fc94520878b0e7d612e Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 9 Sep 2024 23:40:29 +0900 Subject: [PATCH 311/396] pullrequests/ransom_note --- pullrequests/ransom_note/step1.go | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 pullrequests/ransom_note/step1.go diff --git a/pullrequests/ransom_note/step1.go b/pullrequests/ransom_note/step1.go new file mode 100644 index 0000000..7599aa8 --- /dev/null +++ b/pullrequests/ransom_note/step1.go @@ -0,0 +1,27 @@ +//lint:file-ignore U1000 Ignore all unused code +package template + +/* +レビュワーの方へ: + - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 +*/ + +/* +時間:2分 +似たような問題を何回か解いたことがあるので特に困らなかった。 +入力が小文字に限らない場合は、runeをkeyとするmapを使えば良い。その際、Unicodeの扱いには気をつける必要がある。 +https://github.com/rihib/leetcode/pull/5#issue-2446890745 +*/ +func canConstruct(ransomNote string, magazine string) bool { + var frequency [26]int + for _, r := range magazine { + frequency[r-'a']++ + } + for _, r := range ransomNote { + frequency[r-'a']-- + if frequency[r-'a'] < 0 { + return false + } + } + return true +} From 53a4a4432a5ca60644b97e0f9ea8eb0a48874ee2 Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 17 Sep 2024 22:27:10 +0900 Subject: [PATCH 312/396] refactor Climbing Stairs --- go/climbing_stairs.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/climbing_stairs.go b/go/climbing_stairs.go index 8e04f44..b5d2307 100644 --- a/go/climbing_stairs.go +++ b/go/climbing_stairs.go @@ -3,7 +3,7 @@ package main func climbStairs(n int) int { prev, curr := 0, 1 - for i := 0; i < n; i++ { + for i := 1; i <= n; i++ { prev, curr = curr, prev+curr } return curr From 489b8c9e665d55bedc9c0f3eade07065400016de Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 17 Sep 2024 22:44:14 +0900 Subject: [PATCH 313/396] add another solution of Climbing Stairs --- go/climbing_stairs.go | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/go/climbing_stairs.go b/go/climbing_stairs.go index b5d2307..9b075cc 100644 --- a/go/climbing_stairs.go +++ b/go/climbing_stairs.go @@ -1,10 +1,26 @@ //lint:file-ignore U1000 Ignore all unused code package main -func climbStairs(n int) int { +func climbStairsFibonacci(n int) int { prev, curr := 0, 1 for i := 1; i <= n; i++ { prev, curr = curr, prev+curr } return curr } + +func climbStairsDP(n int) int { + m := make(map[int]int, n) + return climbStairsHelper(n, m) +} + +func climbStairsHelper(n int, m map[int]int) int { + if n == 1 || n == 2 { + return n + } + if ways, ok := m[n]; ok { + return ways + } + m[n] = climbStairsHelper(n-1, m) + climbStairsHelper(n-2, m) + return m[n] +} From 1f7ce768b1a0fb18864f274329180a16ed9e22fb Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 17 Sep 2024 23:00:23 +0900 Subject: [PATCH 314/396] pullrequests/climbing_stairs --- pullrequests/climbing_stairs/step1.go | 22 ++++++++++++++++++++++ pullrequests/climbing_stairs/step2.go | 26 ++++++++++++++++++++++++++ pullrequests/climbing_stairs/step3.go | 11 +++++++++++ 3 files changed, 59 insertions(+) create mode 100644 pullrequests/climbing_stairs/step1.go create mode 100644 pullrequests/climbing_stairs/step2.go create mode 100644 pullrequests/climbing_stairs/step3.go diff --git a/pullrequests/climbing_stairs/step1.go b/pullrequests/climbing_stairs/step1.go new file mode 100644 index 0000000..7429041 --- /dev/null +++ b/pullrequests/climbing_stairs/step1.go @@ -0,0 +1,22 @@ +//lint:file-ignore U1000 Ignore all unused code +package template + +/* +レビュワーの方へ: + - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 +*/ + +/* +時間:11分 + +フィボナッチだとわかったので、その方法で解いた。 +少し頭がこんがらがってしまったので時間がかかってしまった。 +本来はn <= 0のときはエラーにするなどすべきだと思う。 +*/ +func climbStairsFibonacci(n int) int { + prev, curr := 0, 1 + for i := 1; i <= n; i++ { + prev, curr = curr, prev+curr + } + return curr +} diff --git a/pullrequests/climbing_stairs/step2.go b/pullrequests/climbing_stairs/step2.go new file mode 100644 index 0000000..79a951e --- /dev/null +++ b/pullrequests/climbing_stairs/step2.go @@ -0,0 +1,26 @@ +//lint:file-ignore U1000 Ignore all unused code +package template + +/* +レビュワーの方へ: + - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 +*/ + +/* +Step1の方法はどちらかというと特殊で、メモ化再帰を使った動的計画法で解くのが本命のような気がしたので、こちらでも解いた。 +*/ +func climbStairsDP(n int) int { + m := make(map[int]int, n) + return climbStairsHelper(n, m) +} + +func climbStairsHelper(n int, m map[int]int) int { + if n == 1 || n == 2 { + return n + } + if ways, ok := m[n]; ok { + return ways + } + m[n] = climbStairsHelper(n-1, m) + climbStairsHelper(n-2, m) + return m[n] +} diff --git a/pullrequests/climbing_stairs/step3.go b/pullrequests/climbing_stairs/step3.go new file mode 100644 index 0000000..063fb3a --- /dev/null +++ b/pullrequests/climbing_stairs/step3.go @@ -0,0 +1,11 @@ +//lint:file-ignore U1000 Ignore all unused code +package template + +/* +レビュワーの方へ: + - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 +*/ + +/* +COMMENT +*/ From c545a3521503139f9acbb3f30de8b64f311ad12a Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 17 Sep 2024 23:01:05 +0900 Subject: [PATCH 315/396] pullrequests/climbing_stairs --- pullrequests/climbing_stairs/step1.go | 2 +- pullrequests/climbing_stairs/step2.go | 2 +- pullrequests/climbing_stairs/step3.go | 11 ----------- 3 files changed, 2 insertions(+), 13 deletions(-) delete mode 100644 pullrequests/climbing_stairs/step3.go diff --git a/pullrequests/climbing_stairs/step1.go b/pullrequests/climbing_stairs/step1.go index 7429041..857187d 100644 --- a/pullrequests/climbing_stairs/step1.go +++ b/pullrequests/climbing_stairs/step1.go @@ -1,5 +1,5 @@ //lint:file-ignore U1000 Ignore all unused code -package template +package climbingstairs /* レビュワーの方へ: diff --git a/pullrequests/climbing_stairs/step2.go b/pullrequests/climbing_stairs/step2.go index 79a951e..6bedbe1 100644 --- a/pullrequests/climbing_stairs/step2.go +++ b/pullrequests/climbing_stairs/step2.go @@ -1,5 +1,5 @@ //lint:file-ignore U1000 Ignore all unused code -package template +package climbingstairs /* レビュワーの方へ: diff --git a/pullrequests/climbing_stairs/step3.go b/pullrequests/climbing_stairs/step3.go deleted file mode 100644 index 063fb3a..0000000 --- a/pullrequests/climbing_stairs/step3.go +++ /dev/null @@ -1,11 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package template - -/* -レビュワーの方へ: - - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 -*/ - -/* -COMMENT -*/ From d2179db6ad799a0bb701503656725c0675e9876a Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 17 Sep 2024 23:13:50 +0900 Subject: [PATCH 316/396] upgrade go --- go/go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/go.mod b/go/go.mod index 845e1f1..634ddbc 100644 --- a/go/go.mod +++ b/go/go.mod @@ -1,3 +1,3 @@ module github.com/rihib/leetcode/go -go 1.21.5 +go 1.23.0 From 552099e8114e12b07e7e4c1d95b7247b965d61b9 Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 19 Sep 2024 00:51:05 +0900 Subject: [PATCH 317/396] refactor Longest Palindrome --- go/longest_palindrome.go | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/go/longest_palindrome.go b/go/longest_palindrome.go index 9677559..f7069f8 100644 --- a/go/longest_palindrome.go +++ b/go/longest_palindrome.go @@ -2,21 +2,18 @@ package main func longestPalindrome(s string) int { - m := make(map[rune]struct{}) - l := 0 - + length := 0 + frequencies := make(map[rune]struct{}) for _, r := range s { - if _, ok := m[r]; ok { - delete(m, r) - l += 2 + if _, ok := frequencies[r]; !ok { + frequencies[r] = struct{}{} } else { - m[r] = struct{}{} + delete(frequencies, r) + length += 2 } } - - if len(m) > 0 { - l++ + if len(frequencies) > 0 { + length++ } - - return l + return length } From fc8f68790e1fdbe1463f91dc140650ffb68b122c Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 19 Sep 2024 01:07:11 +0900 Subject: [PATCH 318/396] refactor Longest Palindrome --- go/longest_palindrome.go | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/go/longest_palindrome.go b/go/longest_palindrome.go index f7069f8..1a502d1 100644 --- a/go/longest_palindrome.go +++ b/go/longest_palindrome.go @@ -3,16 +3,15 @@ package main func longestPalindrome(s string) int { length := 0 - frequencies := make(map[rune]struct{}) + frequencies := make(map[rune]int, len(s)) for _, r := range s { - if _, ok := frequencies[r]; !ok { - frequencies[r] = struct{}{} - } else { - delete(frequencies, r) + frequencies[r]++ + if frequencies[r] == 2 { length += 2 + delete(frequencies, r) } } - if len(frequencies) > 0 { + if len(frequencies) != 0 { length++ } return length From b72ee631c3052855f563a5f62ebc70f4ac87b8d2 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 22 Sep 2024 01:42:09 +0900 Subject: [PATCH 319/396] refactor Majority Element --- go/majority_element.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/go/majority_element.go b/go/majority_element.go index aaa3134..2c5e58d 100644 --- a/go/majority_element.go +++ b/go/majority_element.go @@ -2,16 +2,16 @@ package main func majorityElement(nums []int) int { - candidate, cnt := nums[0], 0 + candidate, count := nums[0], 0 for _, n := range nums { if n == candidate { - cnt++ + count++ } else { - cnt-- - if cnt == 0 { - candidate = n - cnt++ - } + count-- + } + if count < 0 { + candidate = n + count = 0 } } return candidate From 91648694f379bad523c08af38ce4293c606214d1 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 22 Sep 2024 01:53:18 +0900 Subject: [PATCH 320/396] add another solution for Majority Element --- go/majority_element.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/go/majority_element.go b/go/majority_element.go index 2c5e58d..b58aa9a 100644 --- a/go/majority_element.go +++ b/go/majority_element.go @@ -2,6 +2,17 @@ package main func majorityElement(nums []int) int { + frequencies := make(map[int]int, len(nums)) + for _, n := range nums { + frequencies[n]++ + if frequencies[n] > len(nums)/2 { + return n + } + } + return -1 +} + +func majorityElementBoyerMooreMajorityVote(nums []int) int { candidate, count := nums[0], 0 for _, n := range nums { if n == candidate { From 998ac817be3285c834da7637eb79cf50a2e2d045 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 22 Sep 2024 01:58:37 +0900 Subject: [PATCH 321/396] pullrequests/majprity_element --- pullrequests/majority_element/step1.go | 24 ++++++++++++++++++++++ pullrequests/majority_element/step2.go | 28 ++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 pullrequests/majority_element/step1.go create mode 100644 pullrequests/majority_element/step2.go diff --git a/pullrequests/majority_element/step1.go b/pullrequests/majority_element/step1.go new file mode 100644 index 0000000..5b97467 --- /dev/null +++ b/pullrequests/majority_element/step1.go @@ -0,0 +1,24 @@ +//lint:file-ignore U1000 Ignore all unused code +package majorityelement + +/* +レビュワーの方へ: + - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 +*/ + +/* +時間:3分 + +一番自然な方法で解くことにした。 +最後にLeetCodeの制約上しょうがなく-1を返しているが、本当はerrorを返したい。 +*/ +func majorityElement(nums []int) int { + frequencies := make(map[int]int, len(nums)) + for _, n := range nums { + frequencies[n]++ + if frequencies[n] > len(nums)/2 { + return n + } + } + return -1 +} diff --git a/pullrequests/majority_element/step2.go b/pullrequests/majority_element/step2.go new file mode 100644 index 0000000..b984784 --- /dev/null +++ b/pullrequests/majority_element/step2.go @@ -0,0 +1,28 @@ +//lint:file-ignore U1000 Ignore all unused code +package majorityelement + +/* +レビュワーの方へ: + - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 +*/ + +/* +時間:6分 + +Boyer-Moore Voteアルゴリズムでも解いてみた。このアルゴリズムもたまたま知っていたが、思い出しつつ書いたので少し時間がかかってしまった。 +*/ +func majorityElementBoyerMooreMajorityVote(nums []int) int { + candidate, count := nums[0], 0 + for _, n := range nums { + if n == candidate { + count++ + } else { + count-- + } + if count < 0 { + candidate = n + count = 0 + } + } + return candidate +} From a505255dd5d76ade178bf75ea3aa36252e331ca7 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 23 Sep 2024 20:58:14 +0900 Subject: [PATCH 322/396] =?UTF-8?q?refactor(Merge=20Two=20Sorted=20Lists):?= =?UTF-8?q?=20new=E3=82=88=E3=82=8A=E3=82=82=E6=A7=8B=E9=80=A0=E4=BD=93?= =?UTF-8?q?=E3=83=AA=E3=83=86=E3=83=A9=E3=83=AB=E3=81=A7=E5=88=9D=E6=9C=9F?= =?UTF-8?q?=E5=8C=96=E3=81=99=E3=82=8B=E6=96=B9=E3=81=8C=E4=B8=80=E8=88=AC?= =?UTF-8?q?=E7=9A=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go/merge_two_sorted_lists.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/merge_two_sorted_lists.go b/go/merge_two_sorted_lists.go index 0502def..d74998c 100644 --- a/go/merge_two_sorted_lists.go +++ b/go/merge_two_sorted_lists.go @@ -2,7 +2,7 @@ package main func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode { - dummy := new(ListNode) + dummy := &ListNode{} tail := dummy for list1 != nil && list2 != nil { if list1.Val < list2.Val { From b530c54351bf722def5409d063e738b9193787d4 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 23 Sep 2024 21:02:18 +0900 Subject: [PATCH 323/396] =?UTF-8?q?refactor(Contains=20Duplicate):=20?= =?UTF-8?q?=E5=A4=89=E6=95=B0=E5=90=8D=E3=82=92=E6=94=B9=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go/contains_duplicate.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/go/contains_duplicate.go b/go/contains_duplicate.go index b216ac0..887e4b1 100644 --- a/go/contains_duplicate.go +++ b/go/contains_duplicate.go @@ -12,10 +12,11 @@ func containsDuplicate(nums []int) bool { return false } +// 若干トリッキーで意図がわかりづらいので上の方がベター func containsDuplicate2(nums []int) bool { - m := make(map[int]struct{}) + numsMap := make(map[int]struct{}) for _, n := range nums { - m[n] = struct{}{} + numsMap[n] = struct{}{} } - return len(nums) > len(m) + return len(nums) > len(numsMap) } From aa1367b9f0460319e284b75902a81a42bc18e9df Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 23 Sep 2024 21:06:16 +0900 Subject: [PATCH 324/396] fix Merge Two Sorted Lists --- pullrequests/merge_two_sorted_lists/step1.go | 2 +- pullrequests/merge_two_sorted_lists/step2.go | 2 +- pullrequests/merge_two_sorted_lists/step3.go | 2 +- pullrequests/merge_two_sorted_lists/step4.go | 2 +- pullrequests/merge_two_sorted_lists/step5.go | 22 ++++++++++++++++++++ 5 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 pullrequests/merge_two_sorted_lists/step5.go diff --git a/pullrequests/merge_two_sorted_lists/step1.go b/pullrequests/merge_two_sorted_lists/step1.go index 8dac4a4..1bbe056 100644 --- a/pullrequests/merge_two_sorted_lists/step1.go +++ b/pullrequests/merge_two_sorted_lists/step1.go @@ -19,7 +19,7 @@ type ListNode struct { Next *ListNode } -func mergeTwoLists_step1(list1 *ListNode, list2 *ListNode) *ListNode { +func mergeTwoListsStep1(list1 *ListNode, list2 *ListNode) *ListNode { if list1 == nil { return list2 } diff --git a/pullrequests/merge_two_sorted_lists/step2.go b/pullrequests/merge_two_sorted_lists/step2.go index ea5a58c..8d0ec46 100644 --- a/pullrequests/merge_two_sorted_lists/step2.go +++ b/pullrequests/merge_two_sorted_lists/step2.go @@ -5,7 +5,7 @@ package mergetwosortedlists 他の人のコードを色々見て、冗長な部分を消し、リファクタをしました。 */ -func mergeTwoLists_step2(list1 *ListNode, list2 *ListNode) *ListNode { +func mergeTwoListsStep2(list1 *ListNode, list2 *ListNode) *ListNode { dummy := new(ListNode) cur := dummy diff --git a/pullrequests/merge_two_sorted_lists/step3.go b/pullrequests/merge_two_sorted_lists/step3.go index 8dfaac0..e29d0ac 100644 --- a/pullrequests/merge_two_sorted_lists/step3.go +++ b/pullrequests/merge_two_sorted_lists/step3.go @@ -23,7 +23,7 @@ package mergetwosortedlists どう思いますか? */ -func mergeTwoLists_step3(list1 *ListNode, list2 *ListNode) *ListNode { +func mergeTwoListsStep3(list1 *ListNode, list2 *ListNode) *ListNode { dummy := new(ListNode) tail := dummy diff --git a/pullrequests/merge_two_sorted_lists/step4.go b/pullrequests/merge_two_sorted_lists/step4.go index 88f9858..e4c865c 100644 --- a/pullrequests/merge_two_sorted_lists/step4.go +++ b/pullrequests/merge_two_sorted_lists/step4.go @@ -1,7 +1,7 @@ //lint:file-ignore U1000 Ignore all unused code package mergetwosortedlists -func mergeTwoLists_step4(list1 *ListNode, list2 *ListNode) *ListNode { +func mergeTwoListsStep4(list1 *ListNode, list2 *ListNode) *ListNode { dummy := new(ListNode) tail := dummy for list1 != nil && list2 != nil { diff --git a/pullrequests/merge_two_sorted_lists/step5.go b/pullrequests/merge_two_sorted_lists/step5.go new file mode 100644 index 0000000..b2a267a --- /dev/null +++ b/pullrequests/merge_two_sorted_lists/step5.go @@ -0,0 +1,22 @@ +//lint:file-ignore U1000 Ignore all unused code +package mergetwosortedlists + +func mergeTwoListsStep5(list1 *ListNode, list2 *ListNode) *ListNode { + dummy := &ListNode{} + tail := dummy + for list1 != nil && list2 != nil { + if list1.Val < list2.Val { + tail.Next, list1 = list1, list1.Next + } else { + tail.Next, list2 = list2, list2.Next + } + tail = tail.Next + } + if list1 != nil { + tail.Next = list1 + } + if list2 != nil { + tail.Next = list2 + } + return dummy.Next +} From 0ecfc419de3950346bc6f17f4c8bc4aa984dcf19 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 23 Sep 2024 21:08:17 +0900 Subject: [PATCH 325/396] fix Contains Duplicate --- pullrequests/contains_duplicate/step1.go | 2 +- pullrequests/contains_duplicate/step2.go | 4 ++-- pullrequests/contains_duplicate/step3.go | 2 +- pullrequests/contains_duplicate/step4.go | 22 ++++++++++++++++++++++ 4 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 pullrequests/contains_duplicate/step4.go diff --git a/pullrequests/contains_duplicate/step1.go b/pullrequests/contains_duplicate/step1.go index e48d861..6db8956 100644 --- a/pullrequests/contains_duplicate/step1.go +++ b/pullrequests/contains_duplicate/step1.go @@ -10,7 +10,7 @@ package containsduplicate - valueの意味でvを使ったのですが、nのほうがnumsと対応していてより良いかなと思ったので同様にStep2ではnを使うようにしました。 - nmもnumsMapのつもりで使ったのですが同様に他にマップが使われているわけではないのでStep2では単にmとしました。 */ -func containsDuplicate_step1(nums []int) bool { +func containsDuplicateStep1(nums []int) bool { if len(nums) <= 1 { return false } diff --git a/pullrequests/contains_duplicate/step2.go b/pullrequests/contains_duplicate/step2.go index 09180e8..23c3c69 100644 --- a/pullrequests/contains_duplicate/step2.go +++ b/pullrequests/contains_duplicate/step2.go @@ -10,7 +10,7 @@ package containsduplicate - m, nという変数名をどう思いますか?(個人的にはこれぐらいの短いコードであれば逆に長い変数名をつけるのも良くないのではと思ったためあえて一文字の変数を使いました) - 2つの解法のうちどちらのがほうが良いと思いますか?(個人的には下の解法はコード数が短くなるものの、必ずnumsを全て見ないといけないので、その点で若干パフォーマンスは劣るのかなと思っています。気にしなくても良いぐらいの話かもしれませんが、、) */ -func containsDuplicate_step2(nums []int) bool { +func containsDuplicateStep2(nums []int) bool { m := make(map[int]struct{}) for _, n := range nums { if _, ok := m[n]; ok { @@ -21,7 +21,7 @@ func containsDuplicate_step2(nums []int) bool { return false } -func containsDuplicate_anothersolution(nums []int) bool { +func containsDuplicate2Step2(nums []int) bool { m := make(map[int]struct{}) for _, n := range nums { m[n] = struct{}{} diff --git a/pullrequests/contains_duplicate/step3.go b/pullrequests/contains_duplicate/step3.go index cc26164..ca54f69 100644 --- a/pullrequests/contains_duplicate/step3.go +++ b/pullrequests/contains_duplicate/step3.go @@ -1,7 +1,7 @@ //lint:file-ignore U1000 Ignore all unused code package containsduplicate -func containsDuplicate(nums []int) bool { +func containsDuplicateStep3(nums []int) bool { seen := make(map[int]struct{}) for _, n := range nums { if _, ok := seen[n]; ok { diff --git a/pullrequests/contains_duplicate/step4.go b/pullrequests/contains_duplicate/step4.go new file mode 100644 index 0000000..15c6592 --- /dev/null +++ b/pullrequests/contains_duplicate/step4.go @@ -0,0 +1,22 @@ +//lint:file-ignore U1000 Ignore all unused code +package containsduplicate + +func containsDuplicateStep4(nums []int) bool { + seen := make(map[int]struct{}) + for _, n := range nums { + if _, ok := seen[n]; ok { + return true + } + seen[n] = struct{}{} + } + return false +} + +// 若干トリッキーで意図がわかりづらいので上の方がベター +func containsDuplicate2Step4(nums []int) bool { + numsMap := make(map[int]struct{}) + for _, n := range nums { + numsMap[n] = struct{}{} + } + return len(nums) > len(numsMap) +} From bb2fdfc428f5d9e25ede33b607a8366fc0688e33 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 23 Sep 2024 21:42:33 +0900 Subject: [PATCH 326/396] =?UTF-8?q?refactor(Group=20Anagrams):=20=E5=A4=89?= =?UTF-8?q?=E6=95=B0=E5=90=8D=E3=81=AE=E6=94=B9=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go/group_anagrams.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/go/group_anagrams.go b/go/group_anagrams.go index a33bfe4..6ffaf84 100644 --- a/go/group_anagrams.go +++ b/go/group_anagrams.go @@ -4,11 +4,11 @@ package main func groupAnagrams(strs []string) [][]string { anagramsMap := make(map[[26]int][]string) for _, word := range strs { - var frequency [26]int + var frequencies [26]int for _, r := range word { - frequency[r-'a']++ + frequencies[r-'a']++ } - anagramsMap[frequency] = append(anagramsMap[frequency], word) + anagramsMap[frequencies] = append(anagramsMap[frequencies], word) } anagrams := make([][]string, len(anagramsMap)) From 6e14d8ff507c884ac456d3236e3b4a5b9532578b Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 23 Sep 2024 21:44:45 +0900 Subject: [PATCH 327/396] fix pullrequests/group_anagrams --- pullrequests/group_anagrams/step1.go | 2 +- pullrequests/group_anagrams/step2.go | 2 +- pullrequests/group_anagrams/step3.go | 2 +- pullrequests/group_anagrams/step4.go | 2 +- pullrequests/group_anagrams/step5.go | 21 +++++++++++++++++++++ 5 files changed, 25 insertions(+), 4 deletions(-) create mode 100644 pullrequests/group_anagrams/step5.go diff --git a/pullrequests/group_anagrams/step1.go b/pullrequests/group_anagrams/step1.go index 5b18719..5607019 100644 --- a/pullrequests/group_anagrams/step1.go +++ b/pullrequests/group_anagrams/step1.go @@ -8,7 +8,7 @@ package groupanagrams 配列のインデックスを用いて頻度を取得し、keyにすることにした。 */ -func groupAnagrams_step1(strs []string) [][]string { +func groupAnagramsStep1(strs []string) [][]string { m := make(map[[26]int][]string) for _, s := range strs { var freq [26]int diff --git a/pullrequests/group_anagrams/step2.go b/pullrequests/group_anagrams/step2.go index 8ceb662..0381a92 100644 --- a/pullrequests/group_anagrams/step2.go +++ b/pullrequests/group_anagrams/step2.go @@ -5,7 +5,7 @@ package groupanagrams 変数名を改善した。 */ -func groupAnagrams_step2(strs []string) [][]string { +func groupAnagramsStep2(strs []string) [][]string { m := make(map[[26]int][]string) for _, s := range strs { var freq [26]int diff --git a/pullrequests/group_anagrams/step3.go b/pullrequests/group_anagrams/step3.go index 2b40d00..9e3d95d 100644 --- a/pullrequests/group_anagrams/step3.go +++ b/pullrequests/group_anagrams/step3.go @@ -11,7 +11,7 @@ package groupanagrams - wordsという変数名をどう思いますか? */ -func groupAnagrams_step3(strs []string) [][]string { +func groupAnagramsStep3(strs []string) [][]string { m := make(map[[26]int][]string) for _, word := range strs { var freq [26]int diff --git a/pullrequests/group_anagrams/step4.go b/pullrequests/group_anagrams/step4.go index 4e586a6..82ad9f5 100644 --- a/pullrequests/group_anagrams/step4.go +++ b/pullrequests/group_anagrams/step4.go @@ -1,7 +1,7 @@ //lint:file-ignore U1000 Ignore all unused code package groupanagrams -func groupAnagrams(strs []string) [][]string { +func groupAnagramsStep4(strs []string) [][]string { anagramsMap := make(map[[26]int][]string) for _, word := range strs { var frequency [26]int diff --git a/pullrequests/group_anagrams/step5.go b/pullrequests/group_anagrams/step5.go new file mode 100644 index 0000000..8fd20a9 --- /dev/null +++ b/pullrequests/group_anagrams/step5.go @@ -0,0 +1,21 @@ +//lint:file-ignore U1000 Ignore all unused code +package groupanagrams + +func groupAnagramsStep5(strs []string) [][]string { + anagramsMap := make(map[[26]int][]string) + for _, word := range strs { + var frequencies [26]int + for _, r := range word { + frequencies[r-'a']++ + } + anagramsMap[frequencies] = append(anagramsMap[frequencies], word) + } + + anagrams := make([][]string, len(anagramsMap)) + i := 0 + for _, words := range anagramsMap { + anagrams[i] = words + i++ + } + return anagrams +} From 0eaf729832b02f37e25ee2e994a6118dd4b2f2cd Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 23 Sep 2024 21:55:13 +0900 Subject: [PATCH 328/396] =?UTF-8?q?refactor(Valid=20Anagram):=20=E5=A4=89?= =?UTF-8?q?=E6=95=B0=E5=90=8D=E3=82=92=E6=94=B9=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go/valid_anagram.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/go/valid_anagram.go b/go/valid_anagram.go index fae05ba..d50f0a2 100644 --- a/go/valid_anagram.go +++ b/go/valid_anagram.go @@ -2,10 +2,10 @@ package main func isAnagram(s string, t string) bool { - return frequency(s) == frequency(t) + return frequencies(s) == frequencies(t) } -func frequency(s string) [26]int { +func frequencies(s string) [26]int { var f [26]int for _, r := range s { f[r-'a']++ @@ -16,14 +16,14 @@ func frequency(s string) [26]int { // ちゃんとUnicodeに対応させるなら結合文字などを考慮する必要がある // https://github.com/rihib/leetcode/pull/5#discussion_r1706198268 func isAnagramUnicode(s string, t string) bool { - frequency := make(map[rune]int) + frequencies := make(map[rune]int) for _, r := range s { - frequency[r]++ + frequencies[r]++ } for _, r := range t { - frequency[r]-- + frequencies[r]-- } - for _, n := range frequency { + for _, n := range frequencies { if n != 0 { return false } From b5c4f5a64fcfc696db937258429705ed8157f4ae Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 23 Sep 2024 21:57:21 +0900 Subject: [PATCH 329/396] fix pullrequests/valid_anagram --- pullrequests/valid_anagram/step1.go | 4 ++-- pullrequests/valid_anagram/step2.go | 4 ++-- pullrequests/valid_anagram/step3.go | 4 ++-- pullrequests/valid_anagram/step4.go | 32 +++++++++++++++++++++++++++++ 4 files changed, 38 insertions(+), 6 deletions(-) create mode 100644 pullrequests/valid_anagram/step4.go diff --git a/pullrequests/valid_anagram/step1.go b/pullrequests/valid_anagram/step1.go index 63a4aca..5f67ef2 100644 --- a/pullrequests/valid_anagram/step1.go +++ b/pullrequests/valid_anagram/step1.go @@ -8,7 +8,7 @@ package validanagram 基本的にはそれぞれの文字列に含まれる文字の種類と数が一致しているかを見ています。 下の解法について、40行目で0未満になった場合のみfalseを返すのは一見おかしいように見えますが、30行目で文字数が等しいことを確認しているため、一方より多い文字があれば何かの文字は少なくなるはずであるため、ロジック的には問題ないと思います。 */ -func isAnagram_step1(s string, t string) bool { +func isAnagramStep1(s string, t string) bool { if len(s) != len(t) { return false } @@ -26,7 +26,7 @@ func isAnagram_step1(s string, t string) bool { return true } -func isAnagram_unicode_step1(s string, t string) bool { +func isAnagramUnicodeStep1(s string, t string) bool { if len(s) != len(t) { return false } diff --git a/pullrequests/valid_anagram/step2.go b/pullrequests/valid_anagram/step2.go index 1867720..09f0307 100644 --- a/pullrequests/valid_anagram/step2.go +++ b/pullrequests/valid_anagram/step2.go @@ -8,7 +8,7 @@ package validanagram 下の解法についてはStep1のロジックがわかりづらかったので、より明確になるように変更しました。 */ -func isAnagram_step2(s string, t string) bool { +func isAnagramStep2(s string, t string) bool { var frequency [26]int for _, r := range s { frequency[r-'a']++ @@ -24,7 +24,7 @@ func isAnagram_step2(s string, t string) bool { return true } -func isAnagram_unicode_step2(s string, t string) bool { +func isAnagramUnicodeStep2(s string, t string) bool { frequency := make(map[rune]int) for _, r := range s { frequency[r]++ diff --git a/pullrequests/valid_anagram/step3.go b/pullrequests/valid_anagram/step3.go index a3ba67b..d781c83 100644 --- a/pullrequests/valid_anagram/step3.go +++ b/pullrequests/valid_anagram/step3.go @@ -1,7 +1,7 @@ //lint:file-ignore U1000 Ignore all unused code package validanagram -func isAnagram_step3(s string, t string) bool { +func isAnagramStep3(s string, t string) bool { return frequency(s) == frequency(t) } @@ -15,7 +15,7 @@ func frequency(s string) [26]int { // ちゃんとUnicodeに対応させるなら結合文字などを考慮する必要がある // https://github.com/rihib/leetcode/pull/5#discussion_r1706198268 -func isAnagram_unicode_step3(s string, t string) bool { +func isAnagramUnicodeStep3(s string, t string) bool { frequency := make(map[rune]int) for _, r := range s { frequency[r]++ diff --git a/pullrequests/valid_anagram/step4.go b/pullrequests/valid_anagram/step4.go new file mode 100644 index 0000000..b63c510 --- /dev/null +++ b/pullrequests/valid_anagram/step4.go @@ -0,0 +1,32 @@ +//lint:file-ignore U1000 Ignore all unused code +package validanagram + +func isAnagramStep4(s string, t string) bool { + return frequencies(s) == frequencies(t) +} + +func frequencies(s string) [26]int { + var f [26]int + for _, r := range s { + f[r-'a']++ + } + return f +} + +// ちゃんとUnicodeに対応させるなら結合文字などを考慮する必要がある +// https://github.com/rihib/leetcode/pull/5#discussion_r1706198268 +func isAnagramUnicodeStep4(s string, t string) bool { + frequencies := make(map[rune]int) + for _, r := range s { + frequencies[r]++ + } + for _, r := range t { + frequencies[r]-- + } + for _, n := range frequencies { + if n != 0 { + return false + } + } + return true +} From f5f51888330db344f4e92ae6cb304b34742f707c Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 23 Sep 2024 22:02:25 +0900 Subject: [PATCH 330/396] =?UTF-8?q?refactor(Add=20Two=20Numbers):=20?= =?UTF-8?q?=E5=A4=89=E6=95=B0=E5=90=8D=E3=82=92=E6=94=B9=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go/add_two_numbers.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/go/add_two_numbers.go b/go/add_two_numbers.go index b446c86..ce0e5dd 100644 --- a/go/add_two_numbers.go +++ b/go/add_two_numbers.go @@ -3,7 +3,7 @@ package main func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode { dummy := new(ListNode) - curr := dummy + node := dummy carry := 0 for l1 != nil || l2 != nil || carry != 0 { sum := carry @@ -15,9 +15,9 @@ func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode { sum += l2.Val l2 = l2.Next } - curr.Next = &ListNode{Val: sum % 10} + node.Next = &ListNode{Val: sum % 10} carry = sum / 10 - curr = curr.Next + node = node.Next } return dummy.Next } From dc7067c99c2eaacd53163a5fb8b8e1143ebff856 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 23 Sep 2024 22:12:21 +0900 Subject: [PATCH 331/396] =?UTF-8?q?refactor(Two=20Sum):=20=E5=A4=89?= =?UTF-8?q?=E6=95=B0=E5=90=8D=E3=81=AE=E6=94=B9=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go/two_sum.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/go/two_sum.go b/go/two_sum.go index cb74e39..039cfb8 100644 --- a/go/two_sum.go +++ b/go/two_sum.go @@ -2,12 +2,12 @@ package main func twoSum(nums []int, target int) []int { - numsMap := make(map[int]int) + numToIndex := make(map[int]int) for i, n := range nums { - if j, ok := numsMap[target-n]; ok { + if j, ok := numToIndex[target-n]; ok { return []int{i, j} } - numsMap[n] = i + numToIndex[n] = i } - return nil + return nil // 本来ならerrorを返したい } From 70a5f337ee8c4b44e3e62c96dde88657beb95221 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 23 Sep 2024 22:13:49 +0900 Subject: [PATCH 332/396] 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を返したい +} From 1f6cd42af4e148f46db1f5ed71f8a2160be15f98 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 23 Sep 2024 22:30:39 +0900 Subject: [PATCH 333/396] refactor(Combination Sum) --- go/combination_sum.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/combination_sum.go b/go/combination_sum.go index 6ab9f70..65c3316 100644 --- a/go/combination_sum.go +++ b/go/combination_sum.go @@ -28,7 +28,7 @@ func combinationSumBacktrackingIterative(candidates []int, target int) [][]int { current := stack[len(stack)-1] stack = stack[:len(stack)-1] if current.sum == target { - combinations = append(combinations, append([]int{}, current.combination...)) + combinations = append(combinations, current.combination) continue } for i := current.index; i < len(candidates); i++ { From 3865ccc0abbd85e4c264f057ef5aa212a16b4e8a Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 23 Sep 2024 22:33:25 +0900 Subject: [PATCH 334/396] fix pullrequests/combination_sum --- pullrequests/combination_sum/step1.go | 2 +- pullrequests/combination_sum/step2.go | 4 +- pullrequests/combination_sum/step3.go | 2 +- pullrequests/combination_sum/step4.go | 56 +++++++++++++++++++++++++++ 4 files changed, 60 insertions(+), 4 deletions(-) create mode 100644 pullrequests/combination_sum/step4.go diff --git a/pullrequests/combination_sum/step1.go b/pullrequests/combination_sum/step1.go index 03e2ad5..31819b8 100644 --- a/pullrequests/combination_sum/step1.go +++ b/pullrequests/combination_sum/step1.go @@ -5,7 +5,7 @@ package template 時間:24分 少し前にバックトラッキングの問題を解いたので、ある条件を満たす全ての組み合わせを求めるためにバックトラッキングを使って解きました。 */ -func combinationSum_step1(candidates []int, target int) [][]int { +func combinationSumStep1(candidates []int, target int) [][]int { var combinations [][]int var stack []int var findCombinations func(int, int) diff --git a/pullrequests/combination_sum/step2.go b/pullrequests/combination_sum/step2.go index 85acb26..28644ff 100644 --- a/pullrequests/combination_sum/step2.go +++ b/pullrequests/combination_sum/step2.go @@ -5,7 +5,7 @@ package template Step1では再帰を使ってバックトラッキングを解いたので、スタックを使った方法も実装しました。 また、Step1の実装のリファクタもしました。 */ -func combinationSum_backtracking_stack(candidates []int, target int) [][]int { +func combinationSumBacktrackingStack(candidates []int, target int) [][]int { combinations := [][]int{} type state struct { combination []int @@ -33,7 +33,7 @@ func combinationSum_backtracking_stack(candidates []int, target int) [][]int { return combinations } -func combinationSum_backtracking_recursion(candidates []int, target int) [][]int { +func combinationSumBacktrackingRecursion(candidates []int, target int) [][]int { var combinations [][]int var stack []int var generateCombinations func(int, int) diff --git a/pullrequests/combination_sum/step3.go b/pullrequests/combination_sum/step3.go index 08a3b32..13715f3 100644 --- a/pullrequests/combination_sum/step3.go +++ b/pullrequests/combination_sum/step3.go @@ -5,7 +5,7 @@ package template 動的計画法を使った方法も実装しました。 targetごとに組み合わせを求めると重複する組み合わせが生じてしまうので、candidateごとに組み合わせを求めるようにしました。 */ -func combinationSum_dp(candidates []int, target int) [][]int { +func combinationSumDP(candidates []int, target int) [][]int { combinationsGroups := make([][][]int, target+1) combinationsGroups[0] = [][]int{{}} for _, candidate := range candidates { diff --git a/pullrequests/combination_sum/step4.go b/pullrequests/combination_sum/step4.go new file mode 100644 index 0000000..43e04ef --- /dev/null +++ b/pullrequests/combination_sum/step4.go @@ -0,0 +1,56 @@ +//lint:file-ignore U1000 Ignore all unused code +package template + +/* +Step1では再帰を使ってバックトラッキングを解いたので、スタックを使った方法も実装しました。 +また、Step1の実装のリファクタもしました。 +*/ +func combinationSumBacktrackingStackStep4(candidates []int, target int) [][]int { + combinations := [][]int{} + type state struct { + combination []int + sum int + index int + } + stack := []state{{[]int{}, 0, 0}} + for len(stack) > 0 { + current := stack[len(stack)-1] + stack = stack[:len(stack)-1] + if current.sum == target { + combinations = append(combinations, current.combination) + continue + } + for i := current.index; i < len(candidates); i++ { + newSum := current.sum + candidates[i] + if newSum > target { + continue + } + newCombination := append([]int{}, current.combination...) + newCombination = append(newCombination, candidates[i]) + stack = append(stack, state{newCombination, newSum, i}) + } + } + return combinations +} + +func combinationSumBacktrackingRecursionStep4(candidates []int, target int) [][]int { + var combinations [][]int + var stack []int + var generateCombinations func(int, int) + generateCombinations = func(currentIndex int, sum int) { + if sum == target { + combinations = append(combinations, append([]int{}, stack...)) + return + } + if sum > target { + return + } + for i := currentIndex; i < len(candidates); i++ { + stack = append(stack, candidates[i]) + generateCombinations(i, sum+candidates[i]) + stack = stack[:len(stack)-1] + } + } + generateCombinations(0, 0) + return combinations +} From 0ec717abe1e7d9233b89383df05b506eeebffcbf Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 23 Sep 2024 22:43:49 +0900 Subject: [PATCH 335/396] refactor Invert Binary Tree --- go/invert_binary_tree.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/go/invert_binary_tree.go b/go/invert_binary_tree.go index 161dc76..05c681b 100644 --- a/go/invert_binary_tree.go +++ b/go/invert_binary_tree.go @@ -2,9 +2,10 @@ package main func invertTreeRecursive(root *TreeNode) *TreeNode { - if root != nil { - root.Left, root.Right = invertTreeRecursive(root.Right), invertTreeRecursive(root.Left) + if root == nil { + return nil } + root.Left, root.Right = invertTreeRecursive(root.Right), invertTreeRecursive(root.Left) return root } From 2ef461f9770746f0279814fe302af1fe8ef0b35a Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 23 Sep 2024 22:45:03 +0900 Subject: [PATCH 336/396] fix pullrequests/invert_binary_tree --- pullrequests/invert_binary_tree/step3.go | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 pullrequests/invert_binary_tree/step3.go diff --git a/pullrequests/invert_binary_tree/step3.go b/pullrequests/invert_binary_tree/step3.go new file mode 100644 index 0000000..e5d894e --- /dev/null +++ b/pullrequests/invert_binary_tree/step3.go @@ -0,0 +1,10 @@ +//lint:file-ignore U1000 Ignore all unused code +package invertbinarytree + +func invertTreeRecursive(root *TreeNode) *TreeNode { + if root == nil { + return nil + } + root.Left, root.Right = invertTreeRecursive(root.Right), invertTreeRecursive(root.Left) + return root +} From 8cfaade23c30885c7aa69b81e554542e170e7c6f Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 23 Sep 2024 23:01:47 +0900 Subject: [PATCH 337/396] refactor Ransom Note --- go/ransom_note.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/go/ransom_note.go b/go/ransom_note.go index 63cafd5..33a4814 100644 --- a/go/ransom_note.go +++ b/go/ransom_note.go @@ -2,13 +2,13 @@ package main func canConstruct(ransomNote string, magazine string) bool { - var frequency [26]int + var frequencies [26]int for _, r := range magazine { - frequency[r-'a']++ + frequencies[r-'a']++ } for _, r := range ransomNote { - frequency[r-'a']-- - if frequency[r-'a'] < 0 { + frequencies[r-'a']-- + if frequencies[r-'a'] < 0 { return false } } From 43d4051bdcc043ddf9f347055129d0dbaf873a91 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 23 Sep 2024 23:03:31 +0900 Subject: [PATCH 338/396] fix pullrequests/ransom_note --- pullrequests/ransom_note/step1.go | 4 ++-- pullrequests/ransom_note/step2.go | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 pullrequests/ransom_note/step2.go diff --git a/pullrequests/ransom_note/step1.go b/pullrequests/ransom_note/step1.go index 7599aa8..c54d387 100644 --- a/pullrequests/ransom_note/step1.go +++ b/pullrequests/ransom_note/step1.go @@ -1,5 +1,5 @@ //lint:file-ignore U1000 Ignore all unused code -package template +package ransomnote /* レビュワーの方へ: @@ -12,7 +12,7 @@ package template 入力が小文字に限らない場合は、runeをkeyとするmapを使えば良い。その際、Unicodeの扱いには気をつける必要がある。 https://github.com/rihib/leetcode/pull/5#issue-2446890745 */ -func canConstruct(ransomNote string, magazine string) bool { +func canConstructStep1(ransomNote string, magazine string) bool { var frequency [26]int for _, r := range magazine { frequency[r-'a']++ diff --git a/pullrequests/ransom_note/step2.go b/pullrequests/ransom_note/step2.go new file mode 100644 index 0000000..e531624 --- /dev/null +++ b/pullrequests/ransom_note/step2.go @@ -0,0 +1,20 @@ +//lint:file-ignore U1000 Ignore all unused code +package ransomnote + +/* +レビュワーの方へ: + - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 +*/ +func canConstructStep2(ransomNote string, magazine string) bool { + var frequencies [26]int + for _, r := range magazine { + frequencies[r-'a']++ + } + for _, r := range ransomNote { + frequencies[r-'a']-- + if frequencies[r-'a'] < 0 { + return false + } + } + return true +} From 958956657b38d6cba1321058364d243d64411d49 Mon Sep 17 00:00:00 2001 From: rihib Date: Wed, 25 Sep 2024 00:59:43 +0900 Subject: [PATCH 339/396] refactor Add Binary --- go/add_binary.go | 31 +++++++++++++------------------ 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/go/add_binary.go b/go/add_binary.go index c859f5a..959efc0 100644 --- a/go/add_binary.go +++ b/go/add_binary.go @@ -6,31 +6,26 @@ import ( "strings" ) -func addBinary(a, b string) string { - // TestCase: [0, 1], [1, 1], [11, 1] - var reversedRes strings.Builder - maxLen := max(len(a), len(b)) +func addBinary(a string, b string) string { + var reversed strings.Builder + maxLength := max(len(a), len(b)) carry := 0 - - for i := 1; i <= maxLen; i++ { + for i := 1; i <= maxLength; i++ { bitA, bitB := 0, 0 - - if len(a) >= i { - bitA = int(a[len(a)-i] - '0') + if i <= len(a) { + bitA = int(a[len(a)-i] - '0') // a[len(a)-i]がbyte型なので'0'もbyte型と解釈される } - if len(b) >= i { + if i <= len(b) { bitB = int(b[len(b)-i] - '0') } - sum := bitA + bitB + carry carry = sum / 2 - reversedRes.WriteByte(byte(sum%2) + '0') + reversed.WriteByte(byte(sum%2 + '0')) // sum%2がint型なので'0'もint型として扱われる } - if carry > 0 { - reversedRes.WriteByte(byte(carry) + '0') + if carry == 1 { + reversed.WriteByte(byte(carry + '0')) } - - res := []rune(reversedRes.String()) - slices.Reverse(res) - return string(res) + result := []rune(reversed.String()) + slices.Reverse(result) + return string(result) } From 18ed4571e13021a5701cd40f1ae70187bc80bd17 Mon Sep 17 00:00:00 2001 From: rihib Date: Wed, 25 Sep 2024 23:46:09 +0900 Subject: [PATCH 340/396] Add Binary --- pullrequests/add_binary/step1.go | 39 ++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 pullrequests/add_binary/step1.go diff --git a/pullrequests/add_binary/step1.go b/pullrequests/add_binary/step1.go new file mode 100644 index 0000000..303292c --- /dev/null +++ b/pullrequests/add_binary/step1.go @@ -0,0 +1,39 @@ +//lint:file-ignore U1000 Ignore all unused code +package addbinary + +import ( + "slices" + "strings" +) + +/* +レビュワーの方へ: + - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 +*/ + +/* +解法自体はすぐに思いついたが、文字列操作のメソッドの使い方の記憶が曖昧だったので、調べながら書いた。 +*/ +func addBinary(a string, b string) string { + var reversed strings.Builder + maxLength := max(len(a), len(b)) + carry := 0 + for i := 1; i <= maxLength; i++ { + bitA, bitB := 0, 0 + if i <= len(a) { + bitA = int(a[len(a)-i] - '0') + } + if i <= len(b) { + bitB = int(b[len(b)-i] - '0') + } + sum := bitA + bitB + carry + carry = sum / 2 + reversed.WriteByte(byte(sum%2 + '0')) + } + if carry == 1 { + reversed.WriteByte(byte(carry + '0')) + } + result := []rune(reversed.String()) + slices.Reverse(result) + return string(result) +} From 066ae12a2b107939dd4762d99e0ddbdcee7bad03 Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 26 Sep 2024 22:49:46 +0900 Subject: [PATCH 341/396] refactor Middle of the Linked List --- go/middle_of_the_linked_list.go | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/go/middle_of_the_linked_list.go b/go/middle_of_the_linked_list.go index e84775f..54a701d 100644 --- a/go/middle_of_the_linked_list.go +++ b/go/middle_of_the_linked_list.go @@ -2,15 +2,12 @@ package main func middleNode(head *ListNode) *ListNode { - if head == nil || head.Next == nil { - return head + if head == nil { + return nil } - slow, fast := head, head - for fast != nil && fast.Next != nil { slow, fast = slow.Next, fast.Next.Next } - return slow } From c74a7ed4f21fb9a599ea14d524e203cdced0749a Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 26 Sep 2024 22:50:20 +0900 Subject: [PATCH 342/396] refactor Middle of the Linked List --- go/middle_of_the_linked_list.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/go/middle_of_the_linked_list.go b/go/middle_of_the_linked_list.go index 54a701d..a283572 100644 --- a/go/middle_of_the_linked_list.go +++ b/go/middle_of_the_linked_list.go @@ -2,9 +2,6 @@ package main func middleNode(head *ListNode) *ListNode { - if head == nil { - return nil - } slow, fast := head, head for fast != nil && fast.Next != nil { slow, fast = slow.Next, fast.Next.Next From fa1d62b957abc8096a8fd6caa6aba78bc4df0bd2 Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 26 Sep 2024 23:21:37 +0900 Subject: [PATCH 343/396] Middle of the Linked List --- .../middle_of_the_linked_list/step1.go | 28 +++++++++++++++++++ .../middle_of_the_linked_list/step2.go | 18 ++++++++++++ .../middle_of_the_linked_list/step3.go | 24 ++++++++++++++++ 3 files changed, 70 insertions(+) create mode 100644 pullrequests/middle_of_the_linked_list/step1.go create mode 100644 pullrequests/middle_of_the_linked_list/step2.go create mode 100644 pullrequests/middle_of_the_linked_list/step3.go diff --git a/pullrequests/middle_of_the_linked_list/step1.go b/pullrequests/middle_of_the_linked_list/step1.go new file mode 100644 index 0000000..4cc642f --- /dev/null +++ b/pullrequests/middle_of_the_linked_list/step1.go @@ -0,0 +1,28 @@ +//lint:file-ignore U1000 Ignore all unused code +package middleofthelinkedlist + +type ListNode struct { + Val int + Next *ListNode +} + +/* +レビュワーの方へ: + - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 +*/ + +/* +時間:3分 + +しばらく解法が思いつかなかったが、フロイドの循環検出法を思いだし、それと似た方法で解くことができると思いついた。 +*/ +func middleNodeStep1(head *ListNode) *ListNode { + if head == nil { + return nil + } + slow, fast := head, head + for fast != nil && fast.Next != nil { + slow, fast = slow.Next, fast.Next.Next + } + return slow +} diff --git a/pullrequests/middle_of_the_linked_list/step2.go b/pullrequests/middle_of_the_linked_list/step2.go new file mode 100644 index 0000000..dc5b30d --- /dev/null +++ b/pullrequests/middle_of_the_linked_list/step2.go @@ -0,0 +1,18 @@ +//lint:file-ignore U1000 Ignore all unused code +package middleofthelinkedlist + +/* +レビュワーの方へ: + - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 +*/ + +/* +最初の早期リターンはなくても問題ないことに気づき、削除した。 +*/ +func middleNodeStep2(head *ListNode) *ListNode { + slow, fast := head, head + for fast != nil && fast.Next != nil { + slow, fast = slow.Next, fast.Next.Next + } + return slow +} diff --git a/pullrequests/middle_of_the_linked_list/step3.go b/pullrequests/middle_of_the_linked_list/step3.go new file mode 100644 index 0000000..eae00e1 --- /dev/null +++ b/pullrequests/middle_of_the_linked_list/step3.go @@ -0,0 +1,24 @@ +//lint:file-ignore U1000 Ignore all unused code +package middleofthelinkedlist + +/* +レビュワーの方へ: + - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 +*/ + +/* +他の方の解法を見て実装してみた。この方法を先に思いつかなかったのが逆に良くない気がした。 +*/ +func middleNodeStep3(head *ListNode) *ListNode { + count := 0 + node := head + for node != nil { + node = node.Next + count++ + } + middle := head + for i := 0; i < count/2; i++ { + middle = middle.Next + } + return middle +} From f9dcfc81bfbf994926e08908c95b724912c164a2 Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 26 Sep 2024 23:31:20 +0900 Subject: [PATCH 344/396] refactor Maximum Depth of Binary Tree --- go/maximum_depth_of_binary_tree.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/go/maximum_depth_of_binary_tree.go b/go/maximum_depth_of_binary_tree.go index 2e52993..864ad6a 100644 --- a/go/maximum_depth_of_binary_tree.go +++ b/go/maximum_depth_of_binary_tree.go @@ -2,11 +2,10 @@ package main func maxDepth(root *TreeNode) int { - // TestCase: [], [0], [0, 1], [0, 1, 2], [0, 1, null, 2] if root == nil { return 0 } - - maxdepth := max(maxDepth(root.Left), maxDepth(root.Right)) + 1 - return maxdepth + leftDepth := maxDepth(root.Left) + rightDepth := maxDepth(root.Right) + return max(leftDepth, rightDepth) + 1 } From f11269b659109f4d24131fa75648ec38cca0d562 Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 26 Sep 2024 23:43:10 +0900 Subject: [PATCH 345/396] add another solution of Middle of the Linked List --- go/middle_of_the_linked_list.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/go/middle_of_the_linked_list.go b/go/middle_of_the_linked_list.go index a283572..3ec2eb4 100644 --- a/go/middle_of_the_linked_list.go +++ b/go/middle_of_the_linked_list.go @@ -2,6 +2,20 @@ package main func middleNode(head *ListNode) *ListNode { + count := 0 + node := head + for node != nil { + node = node.Next + count++ + } + middle := head + for i := 0; i < count/2; i++ { + middle = middle.Next + } + return middle +} + +func middleNode2(head *ListNode) *ListNode { slow, fast := head, head for fast != nil && fast.Next != nil { slow, fast = slow.Next, fast.Next.Next From e751ec688c15341ed8497522eaf46edfc11ff8f7 Mon Sep 17 00:00:00 2001 From: rihib Date: Fri, 27 Sep 2024 00:15:26 +0900 Subject: [PATCH 346/396] Maximum Depth of Binary Tree --- go/maximum_depth_of_binary_tree.go | 51 ++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/go/maximum_depth_of_binary_tree.go b/go/maximum_depth_of_binary_tree.go index 864ad6a..50878bd 100644 --- a/go/maximum_depth_of_binary_tree.go +++ b/go/maximum_depth_of_binary_tree.go @@ -1,11 +1,56 @@ //lint:file-ignore U1000 Ignore all unused code package main -func maxDepth(root *TreeNode) int { +func maxDepthRecursive(root *TreeNode) int { if root == nil { return 0 } - leftDepth := maxDepth(root.Left) - rightDepth := maxDepth(root.Right) + leftDepth := maxDepthRecursive(root.Left) + rightDepth := maxDepthRecursive(root.Right) return max(leftDepth, rightDepth) + 1 } + +func maxDepthIterativeDFS(root *TreeNode) int { + if root == nil { + return 0 + } + maximum := 0 + stack := []entry{{root, 1}} + for len(stack) > 0 { + e := stack[len(stack)-1] + stack = stack[:len(stack)-1] + maximum = max(maximum, e.depth) + if e.node.Left != nil { + stack = append(stack, entry{e.node.Left, e.depth + 1}) + } + if e.node.Right != nil { + stack = append(stack, entry{e.node.Right, e.depth + 1}) + } + } + return maximum +} + +func maxDepthIterativeBFS(root *TreeNode) int { + if root == nil { + return 0 + } + maximum := 0 + queue := []entry{{root, 1}} + for len(queue) > 0 { + e := queue[0] + queue = queue[1:] + maximum = max(maximum, e.depth) + if e.node.Left != nil { + queue = append(queue, entry{e.node.Left, e.depth + 1}) + } + if e.node.Right != nil { + queue = append(queue, entry{e.node.Right, e.depth + 1}) + } + } + return maximum +} + +type entry struct { + node *TreeNode + depth int +} From b784d6b73ebd812e761291f9188931539c7beab3 Mon Sep 17 00:00:00 2001 From: rihib Date: Fri, 27 Sep 2024 01:50:35 +0900 Subject: [PATCH 347/396] add another solution of maximum depth of binary tree --- go/maximum_depth_of_binary_tree.go | 124 +++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) diff --git a/go/maximum_depth_of_binary_tree.go b/go/maximum_depth_of_binary_tree.go index 50878bd..508d913 100644 --- a/go/maximum_depth_of_binary_tree.go +++ b/go/maximum_depth_of_binary_tree.go @@ -1,6 +1,14 @@ //lint:file-ignore U1000 Ignore all unused code package main +/* +再帰 +*/ +// 1フレームの大きさは、引数8 + 返り値8 + ローカル変数(8 + 8) + FP + 戻りアドレス = 48Bぐらい。 +// 最大ノード数が10^4なのでスタックサイズは、48 * 10^4 = 480KBぐらいになると予想できる。 +// Linuxのデフォルトのスタックの大きさが8MBなのでスタックオーバーフローの危険性は低い。 +// goroutineのデフォルトのスタックの大きさは8KBだが、動的に拡張されるようになっているので通常、スタックサイズがGBレベルになっても問題なく再帰を回すことができる。 +// https://github.com/rihib/leetcode/pull/15#issue-2459505166 func maxDepthRecursive(root *TreeNode) int { if root == nil { return 0 @@ -10,6 +18,10 @@ func maxDepthRecursive(root *TreeNode) int { return max(leftDepth, rightDepth) + 1 } +/* +DFS +*/ +// pushする前にnilノードを弾く func maxDepthIterativeDFS(root *TreeNode) int { if root == nil { return 0 @@ -30,6 +42,77 @@ func maxDepthIterativeDFS(root *TreeNode) int { return maximum } +// popした後にnilノードを弾く +func maxDepthIterativeDFS2(root *TreeNode) int { + maximum := 0 + stack := []entry{{root, 1}} + for len(stack) > 0 { + e := stack[len(stack)-1] + stack = stack[:len(stack)-1] + if e.node == nil { + continue + } + maximum = max(maximum, e.depth) + stack = append(stack, entry{e.node.Left, e.depth + 1}) + stack = append(stack, entry{e.node.Right, e.depth + 1}) + } + return maximum +} + +// 帰りがけにdepthを更新 +func maxDepthIterativeDFS3(root *TreeNode) int { + maximum := 0 + stack := []*entry2{ + { + node: root, + isPreorder: true, + depth: &maximum, + leftDepth: new(int), + rightDepth: new(int), + }, + } + for len(stack) > 0 { + e := stack[len(stack)-1] + stack = stack[:len(stack)-1] + if e.isPreorder { + if e.node == nil { + continue + } + e.isPreorder = false + stack = append(stack, e) + stack = append(stack, &entry2{ + node: e.node.Left, + isPreorder: true, + depth: e.leftDepth, + leftDepth: new(int), + rightDepth: new(int), + }) + stack = append(stack, &entry2{ + node: e.node.Right, + isPreorder: true, + depth: e.rightDepth, + leftDepth: new(int), + rightDepth: new(int), + }) + } else { + *e.depth = max(*e.leftDepth, *e.rightDepth) + 1 + } + } + return maximum +} + +type entry2 struct { + node *TreeNode + isPreorder bool + depth *int + leftDepth *int + rightDepth *int +} + +/* +BFS +*/ +// pushする前にnilノードを弾く func maxDepthIterativeBFS(root *TreeNode) int { if root == nil { return 0 @@ -50,7 +133,48 @@ func maxDepthIterativeBFS(root *TreeNode) int { return maximum } +// popした後にnilノードを弾く +func maxDepthIterativeBFS2(root *TreeNode) int { + maximum := 0 + queue := []entry{{root, 1}} + for len(queue) > 0 { + e := queue[0] + queue = queue[1:] + if e.node == nil { + continue + } + maximum = max(maximum, e.depth) + queue = append(queue, entry{e.node.Left, e.depth + 1}) + queue = append(queue, entry{e.node.Right, e.depth + 1}) + } + return maximum +} + type entry struct { node *TreeNode depth int } + +// depthを保持せずに処理する +func maxDepthIterativeBFS3(root *TreeNode) int { + if root == nil { + return 0 + } + maximum := 0 + queue := []*TreeNode{root} + for len(queue) > 0 { + maximum++ + count := len(queue) + for i := 0; i < count; i++ { + node := queue[0] + queue = queue[1:] + if node.Left != nil { + queue = append(queue, node.Left) + } + if node.Right != nil { + queue = append(queue, node.Right) + } + } + } + return maximum +} From fd827c0a1dea242eeb5b457a338e508a010cdf13 Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 15 Oct 2024 10:33:34 +0900 Subject: [PATCH 348/396] refactor Roman to Integer --- go/roman_to_integer.go | 62 ++++++++++++++++++++++++++++++------------ 1 file changed, 45 insertions(+), 17 deletions(-) diff --git a/go/roman_to_integer.go b/go/roman_to_integer.go index 5f7434a..9cb10d0 100644 --- a/go/roman_to_integer.go +++ b/go/roman_to_integer.go @@ -2,26 +2,54 @@ package main func romanToInt(s string) int { - symbols := map[string]int{ - "I": 1, - "V": 5, - "X": 10, - "L": 50, - "C": 100, - "D": 500, - "M": 1000, + symbolToInt := map[rune]int{ + 'I': 1, + 'V': 5, + 'X': 10, + 'L': 50, + 'C': 100, + 'D': 500, + 'M': 1000, } + total := 0 + runeS := []rune(s) + currIndex, nextIndex := 0, 1 + for currIndex < len(runeS) && nextIndex < len(runeS) { + curr, next := runeS[currIndex], runeS[nextIndex] + if (curr == 'I' && (next == 'V' || next == 'X')) || + (curr == 'X' && (next == 'L' || next == 'C')) || + (curr == 'C' && (next == 'D' || next == 'M')) { + total += symbolToInt[next] - symbolToInt[curr] + currIndex, nextIndex = currIndex+2, nextIndex+2 + continue + } + total += symbolToInt[curr] + currIndex, nextIndex = currIndex+1, nextIndex+1 + } + if currIndex < len(runeS) { + total += symbolToInt[runeS[currIndex]] + } + return total +} - res := 0 - runes := []rune(s) - for i := 0; i < len(runes); i++ { - if i+1 < len(runes) && - symbols[string(runes[i])] < symbols[string(runes[i+1])] { - res -= symbols[string(runes[i])] +func romanToInt2(s string) int { + symbolToInt := map[rune]int{ + 'I': 1, + 'V': 5, + 'X': 10, + 'L': 50, + 'C': 100, + 'D': 500, + 'M': 1000, + } + total := 0 + runeS := []rune(s) + for i, r := range runeS { + if i+1 < len(runeS) && symbolToInt[r] < symbolToInt[runeS[i+1]] { + total -= symbolToInt[r] } else { - res += symbols[string(runes[i])] + total += symbolToInt[r] } } - - return res + return total } From 79b53cd52130796e8985fc97d2f71d177b9d081b Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 15 Oct 2024 10:44:23 +0900 Subject: [PATCH 349/396] pullrequests/roman_to_integer --- pullrequests/roman_to_integer/step1.go | 42 ++++++++++++++++++++++++++ pullrequests/roman_to_integer/step2.go | 33 ++++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 pullrequests/roman_to_integer/step1.go create mode 100644 pullrequests/roman_to_integer/step2.go diff --git a/pullrequests/roman_to_integer/step1.go b/pullrequests/roman_to_integer/step1.go new file mode 100644 index 0000000..a2a8aa8 --- /dev/null +++ b/pullrequests/roman_to_integer/step1.go @@ -0,0 +1,42 @@ +//lint:file-ignore U1000 Ignore all unused code +package template + +/* +レビュワーの方へ: + - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 +*/ + +/* +時間:25分 +方針自体はすぐに思いついたが、単純に実装に時間がかかってしまった。 +*/ +func romanToIntStep1(s string) int { + symbolToInt := map[rune]int{ + 'I': 1, + 'V': 5, + 'X': 10, + 'L': 50, + 'C': 100, + 'D': 500, + 'M': 1000, + } + total := 0 + runeS := []rune(s) + currIndex, nextIndex := 0, 1 + for currIndex < len(runeS) && nextIndex < len(runeS) { + curr, next := runeS[currIndex], runeS[nextIndex] + if (curr == 'I' && (next == 'V' || next == 'X')) || + (curr == 'X' && (next == 'L' || next == 'C')) || + (curr == 'C' && (next == 'D' || next == 'M')) { + total += symbolToInt[next] - symbolToInt[curr] + currIndex, nextIndex = currIndex+2, nextIndex+2 + continue + } + total += symbolToInt[curr] + currIndex, nextIndex = currIndex+1, nextIndex+1 + } + if currIndex < len(runeS) { + total += symbolToInt[runeS[currIndex]] + } + return total +} diff --git a/pullrequests/roman_to_integer/step2.go b/pullrequests/roman_to_integer/step2.go new file mode 100644 index 0000000..9063f83 --- /dev/null +++ b/pullrequests/roman_to_integer/step2.go @@ -0,0 +1,33 @@ +//lint:file-ignore U1000 Ignore all unused code +package template + +/* +レビュワーの方へ: + - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 +*/ + +/* +前のシンボルの方が後ろのシンボルよりも小さい場合として考えることができる。 +ただ個人的にはStep1の方が要件に明確に沿っているので良いのではと思っている。 +*/ +func romanToIntStep2(s string) int { + symbolToInt := map[rune]int{ + 'I': 1, + 'V': 5, + 'X': 10, + 'L': 50, + 'C': 100, + 'D': 500, + 'M': 1000, + } + total := 0 + runeS := []rune(s) + for i, r := range runeS { + if i+1 < len(runeS) && symbolToInt[r] < symbolToInt[runeS[i+1]] { + total -= symbolToInt[r] + } else { + total += symbolToInt[r] + } + } + return total +} From dc07f266d7b5f513fb9586712548120de9f20050 Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 15 Oct 2024 10:45:55 +0900 Subject: [PATCH 350/396] fix --- pullrequests/roman_to_integer/step1.go | 2 +- pullrequests/roman_to_integer/step2.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pullrequests/roman_to_integer/step1.go b/pullrequests/roman_to_integer/step1.go index a2a8aa8..4bfbfc4 100644 --- a/pullrequests/roman_to_integer/step1.go +++ b/pullrequests/roman_to_integer/step1.go @@ -1,5 +1,5 @@ //lint:file-ignore U1000 Ignore all unused code -package template +package romantointeger /* レビュワーの方へ: diff --git a/pullrequests/roman_to_integer/step2.go b/pullrequests/roman_to_integer/step2.go index 9063f83..1634c56 100644 --- a/pullrequests/roman_to_integer/step2.go +++ b/pullrequests/roman_to_integer/step2.go @@ -1,5 +1,5 @@ //lint:file-ignore U1000 Ignore all unused code -package template +package romantointeger /* レビュワーの方へ: From a7cbf9ad5957df2ec11e260a4dbd547c6cca69f8 Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 15 Oct 2024 21:29:49 +0900 Subject: [PATCH 351/396] refactor Backspace String Compare --- go/backspace_string_compare.go | 72 ++++++++++++++++++++++++---------- 1 file changed, 52 insertions(+), 20 deletions(-) diff --git a/go/backspace_string_compare.go b/go/backspace_string_compare.go index 9a17c29..e3d9c77 100644 --- a/go/backspace_string_compare.go +++ b/go/backspace_string_compare.go @@ -2,36 +2,68 @@ package main func backspaceCompare(s string, t string) bool { - i, j := len(s)-1, len(t)-1 - sCnt, tCnt := 0, 0 - + runeS, runeT := []rune(s), []rune(t) + i, j := len(runeS)-1, len(runeT)-1 for i >= 0 || j >= 0 { - i = nextIdx(s, i, &sCnt) - j = nextIdx(t, j, &tCnt) - - if i >= 0 && j >= 0 && s[i] != t[j] { - return false + i, j = nextIndex(runeS, i), nextIndex(runeT, j) + if i >= 0 && j >= 0 && runeS[i] == runeT[j] { + i-- + j-- + continue } - if (i >= 0) != (j >= 0) { + if i >= 0 || j >= 0 { return false } - i-- - j-- } - return true } -func nextIdx(str string, idx int, cnt *int) int { - for idx >= 0 { - if str[idx] == '#' { - *cnt++ - } else if *cnt > 0 { - *cnt-- +func nextIndex(runeS []rune, index int) int { + count := 0 + for { + if index >= 0 && runeS[index] == '#' { + count++ + } else if count > 0 { + count-- } else { break } - idx-- + index-- + } + return index +} + +func backspaceCompare2(s string, t string) bool { + runeS, runeT := []rune(s), []rune(t) + i, j := len(runeS)-1, len(runeT)-1 + sCount, tCount := 0, 0 + for i >= 0 || j >= 0 { + if i >= 0 && runeS[i] == '#' { + sCount++ + i-- + continue + } + if j >= 0 && runeT[j] == '#' { + tCount++ + j-- + continue + } + if sCount > 0 { + sCount-- + i-- + continue + } + if tCount > 0 { + tCount-- + j-- + continue + } + if i >= 0 && j >= 0 && runeS[i] == runeT[j] { + i-- + j-- + continue + } + return false } - return idx + return true } From 608dff5a5af522e9d3ec96ac2628b93974a50e7c Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 15 Oct 2024 21:49:25 +0900 Subject: [PATCH 352/396] refactor Backspace String Compare --- go/backspace_string_compare.go | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/go/backspace_string_compare.go b/go/backspace_string_compare.go index e3d9c77..e70e44d 100644 --- a/go/backspace_string_compare.go +++ b/go/backspace_string_compare.go @@ -1,7 +1,25 @@ //lint:file-ignore U1000 Ignore all unused code package main -func backspaceCompare(s string, t string) bool { +func backspaceCompareStack(s string, t string) bool { + return typedText(s) == typedText(t) +} + +func typedText(s string) string { + var stack []rune + for _, r := range s { + if r == '#' { + if len(stack) > 0 { + stack = stack[:len(stack)-1] + } + continue + } + stack = append(stack, r) + } + return string(stack) +} + +func backspaceCompareReverse1(s string, t string) bool { runeS, runeT := []rune(s), []rune(t) i, j := len(runeS)-1, len(runeT)-1 for i >= 0 || j >= 0 { @@ -33,7 +51,7 @@ func nextIndex(runeS []rune, index int) int { return index } -func backspaceCompare2(s string, t string) bool { +func backspaceCompareReverse2(s string, t string) bool { runeS, runeT := []rune(s), []rune(t) i, j := len(runeS)-1, len(runeT)-1 sCount, tCount := 0, 0 From d66cfc56fcee65213d7145451b9112476d4a92bd Mon Sep 17 00:00:00 2001 From: rihib Date: Wed, 16 Oct 2024 21:13:30 +0900 Subject: [PATCH 353/396] refactor Counting Bits --- go/counting_bits.go | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/go/counting_bits.go b/go/counting_bits.go index 1126956..e9e2c4d 100644 --- a/go/counting_bits.go +++ b/go/counting_bits.go @@ -1,14 +1,32 @@ //lint:file-ignore U1000 Ignore all unused code package main +// 2の冪乗の時はMSBのみが1になる +// それ以外の場合はMSB以外の部分はすでに前に計算していてメモ化されているのでそれを使えばいい func countBits(n int) []int { - res := make([]int, n+1) - powerOf2 := 1 + bitCounts := make([]int, n+1) + powerOfTwo := 1 for i := 1; i <= n; i++ { - if powerOf2*2 == i { - powerOf2 = i + if i == powerOfTwo*2 { + powerOfTwo = i } - res[i] = 1 + res[i-powerOf2] + bitCounts[i] = 1 + bitCounts[i-powerOfTwo] } - return res + return bitCounts +} + +// 内側のループはnを2で割り続けるのでlog n回 +// 外側のループはn回なので、全体でO(n log n)になる +func countBits2(n int) []int { + bitCounts := make([]int, n+1) + for i := 0; i <= n; i++ { + num := i + count := 0 + for num > 0 { + count += num % 2 + num /= 2 + } + bitCounts[i] = count + } + return bitCounts } From 61240d2df8b5f68560b45bb858f6c0c6e9186e95 Mon Sep 17 00:00:00 2001 From: rihib Date: Wed, 16 Oct 2024 21:19:00 +0900 Subject: [PATCH 354/396] pullrequests/counting_bits --- pullrequests/counting_bits/step1.go | 27 +++++++++++++++++++++++++++ pullrequests/counting_bits/step2.go | 23 +++++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 pullrequests/counting_bits/step1.go create mode 100644 pullrequests/counting_bits/step2.go diff --git a/pullrequests/counting_bits/step1.go b/pullrequests/counting_bits/step1.go new file mode 100644 index 0000000..75aeeb6 --- /dev/null +++ b/pullrequests/counting_bits/step1.go @@ -0,0 +1,27 @@ +//lint:file-ignore U1000 Ignore all unused code +package template + +/* +レビュワーの方へ: + - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 +*/ + +/* +時間:11分 +問題を理解するのに3分かかってしまった(問題文の英語が難しかった、、) +解法を思いつくのにも少し時間がかかってしまった。 +この方法だと内側のループでO(log n)、外側のループでO(n)かかるので、全体でO(n log n)かかる。 +*/ +func countBitsStep1(n int) []int { + bitCounts := make([]int, n+1) + for i := 0; i <= n; i++ { + num := i + count := 0 + for num > 0 { + count += num % 2 + num /= 2 + } + bitCounts[i] = count + } + return bitCounts +} diff --git a/pullrequests/counting_bits/step2.go b/pullrequests/counting_bits/step2.go new file mode 100644 index 0000000..5ca1742 --- /dev/null +++ b/pullrequests/counting_bits/step2.go @@ -0,0 +1,23 @@ +//lint:file-ignore U1000 Ignore all unused code +package template + +/* +レビュワーの方へ: + - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 +*/ + +/* +DPのメモカを利用すればO(n)で解ける。 +2の冪乗のときは必ず1になるし、それ以外の場合は前に計算した結果+1すれば良い。 +*/ +func countBitsStep2(n int) []int { + bitCounts := make([]int, n+1) + powerOfTwo := 1 + for i := 1; i <= n; i++ { + if i == powerOfTwo*2 { + powerOfTwo = i + } + bitCounts[i] = 1 + bitCounts[i-powerOfTwo] + } + return bitCounts +} From d922262609cd673b65837168be141b5297502f8d Mon Sep 17 00:00:00 2001 From: rihib Date: Wed, 16 Oct 2024 21:29:10 +0900 Subject: [PATCH 355/396] fix --- pullrequests/counting_bits/step1.go | 2 +- pullrequests/counting_bits/step2.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pullrequests/counting_bits/step1.go b/pullrequests/counting_bits/step1.go index 75aeeb6..17046ce 100644 --- a/pullrequests/counting_bits/step1.go +++ b/pullrequests/counting_bits/step1.go @@ -1,5 +1,5 @@ //lint:file-ignore U1000 Ignore all unused code -package template +package countingbits /* レビュワーの方へ: diff --git a/pullrequests/counting_bits/step2.go b/pullrequests/counting_bits/step2.go index 5ca1742..b2c4a4c 100644 --- a/pullrequests/counting_bits/step2.go +++ b/pullrequests/counting_bits/step2.go @@ -1,5 +1,5 @@ //lint:file-ignore U1000 Ignore all unused code -package template +package countingbits /* レビュワーの方へ: From d3e529a81d94705d049c92bad07377720a1b1bd2 Mon Sep 17 00:00:00 2001 From: rihib Date: Wed, 16 Oct 2024 22:18:31 +0900 Subject: [PATCH 356/396] refactor Same Tree --- go/same_tree.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/go/same_tree.go b/go/same_tree.go index ed9f2ee..c89f776 100644 --- a/go/same_tree.go +++ b/go/same_tree.go @@ -2,14 +2,11 @@ package main func isSameTree(p *TreeNode, q *TreeNode) bool { - // TestCase: [[], []], [[1], []], [[1], [1]], [[1, 2, 3], [1, 2]] if p == nil && q == nil { return true } - if p == nil || q == nil || p.Val != q.Val { return false } - return isSameTree(p.Left, q.Left) && isSameTree(p.Right, q.Right) } From fd13554643cf8232336f2dd26e3cd54070ec48fd Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 19 Oct 2024 01:06:03 +0900 Subject: [PATCH 357/396] refactor Number of 1 Bits --- go/number_of_1bits.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/go/number_of_1bits.go b/go/number_of_1bits.go index 5eb164a..3df2494 100644 --- a/go/number_of_1bits.go +++ b/go/number_of_1bits.go @@ -2,10 +2,10 @@ package main func hammingWeight(n int) int { - cnt := 0 + count := 0 for n > 0 { - n &= n - 1 - cnt += 1 + count += n % 2 + n /= 2 } - return cnt + return count } From 9a5dc12203467ea668d776309c1604c0eeced966 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 19 Oct 2024 17:16:50 +0900 Subject: [PATCH 358/396] refactor Number of 1 bits --- go/number_of_1bits.go | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/go/number_of_1bits.go b/go/number_of_1bits.go index 3df2494..94bc4e2 100644 --- a/go/number_of_1bits.go +++ b/go/number_of_1bits.go @@ -1,7 +1,7 @@ //lint:file-ignore U1000 Ignore all unused code package main -func hammingWeight(n int) int { +func hammingWeightNaive1(n int) int { count := 0 for n > 0 { count += n % 2 @@ -9,3 +9,30 @@ func hammingWeight(n int) int { } return count } + +func hammingWeightNaive2(n int) int { + count := 0 + for n != 0 { + count += n & 1 + n >>= 1 + } + return count +} + +func hammingWeightBitmanipulation(n int) int { + count := 0 + for n > 0 { + n &= n - 1 + count += 1 + } + return count +} + +func hammingWeight2Complement(n int) int { + count := 0 + for n > 0 { + n -= (n & -n) + count += 1 + } + return count +} From 15f0c1c1940a5d259099b13ed5adbc469e6e73c4 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 21 Oct 2024 23:48:05 +0900 Subject: [PATCH 359/396] refactor Longest Common Prefix --- go/longest_common_prefix.go | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/go/longest_common_prefix.go b/go/longest_common_prefix.go index 6efdfa1..8790e4b 100644 --- a/go/longest_common_prefix.go +++ b/go/longest_common_prefix.go @@ -1,13 +1,36 @@ //lint:file-ignore U1000 Ignore all unused code package main -import "sort" +import ( + "sort" +) -func longestCommonPrefix(strs []string) string { - if len(strs) == 1 { - return strs[0] +func longestCommonPrefix1(strs []string) string { + if len(strs) == 0 { + return "" } + var prefix []rune + for i := 0; ; i++ { + if i >= len(strs[0]) { + return string(prefix) + } + curr := strs[0][i] + for _, word := range strs { + if i >= len(word) { + return string(prefix) + } + if word[i] != curr { + return string(prefix) + } + } + prefix = append(prefix, rune(curr)) + } +} +func longestCommonPrefix2(strs []string) string { + if len(strs) == 0 { + return "" + } sort.Strings(strs) for i := range strs[0] { if strs[0][i] != strs[len(strs)-1][i] { From 7fc148082cba9941af139b84b60b42f90bd5cd5c Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 21 Oct 2024 23:48:20 +0900 Subject: [PATCH 360/396] refactor Longest Common Prefix --- go/longest_common_prefix.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/go/longest_common_prefix.go b/go/longest_common_prefix.go index 8790e4b..c07e359 100644 --- a/go/longest_common_prefix.go +++ b/go/longest_common_prefix.go @@ -39,3 +39,24 @@ func longestCommonPrefix2(strs []string) string { } return strs[0] } + +func longestCommonPrefix3(strs []string) string { + if len(strs) == 0 { + return "" + } + minLen := len(strs[0]) + for _, str := range strs { + if len(str) < minLen { + minLen = len(str) + } + } + for i := 0; i < minLen; i++ { + curr := strs[0][i] + for _, word := range strs[1:] { + if word[i] != curr { + return strs[0][:i] + } + } + } + return strs[0][:minLen] +} From 3b67760d49bc78617adfd82222850993fcce432d Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 21 Oct 2024 23:56:08 +0900 Subject: [PATCH 361/396] refactor Longest Common Prefix --- go/longest_common_prefix.go | 44 +++++++++---------------------------- 1 file changed, 10 insertions(+), 34 deletions(-) diff --git a/go/longest_common_prefix.go b/go/longest_common_prefix.go index c07e359..ed2725a 100644 --- a/go/longest_common_prefix.go +++ b/go/longest_common_prefix.go @@ -9,22 +9,19 @@ func longestCommonPrefix1(strs []string) string { if len(strs) == 0 { return "" } - var prefix []rune - for i := 0; ; i++ { - if i >= len(strs[0]) { - return string(prefix) - } - curr := strs[0][i] - for _, word := range strs { - if i >= len(word) { - return string(prefix) - } - if word[i] != curr { - return string(prefix) + minLength := len(strs[0]) + for _, s := range strs { + minLength = min(minLength, len(s)) + } + for i := 0; i < minLength; i++ { + c := strs[0][i] + for _, word := range strs[1:] { + if word[i] != c { + return strs[0][:i] } } - prefix = append(prefix, rune(curr)) } + return strs[0][:minLength] } func longestCommonPrefix2(strs []string) string { @@ -39,24 +36,3 @@ func longestCommonPrefix2(strs []string) string { } return strs[0] } - -func longestCommonPrefix3(strs []string) string { - if len(strs) == 0 { - return "" - } - minLen := len(strs[0]) - for _, str := range strs { - if len(str) < minLen { - minLen = len(str) - } - } - for i := 0; i < minLen; i++ { - curr := strs[0][i] - for _, word := range strs[1:] { - if word[i] != curr { - return strs[0][:i] - } - } - } - return strs[0][:minLen] -} From 83b6e371a6ba26b30dfda7ac8c5798507ed49890 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 2 Nov 2024 13:34:55 +0900 Subject: [PATCH 362/396] refactor --- go/linked_list_cycle.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/go/linked_list_cycle.go b/go/linked_list_cycle.go index e8cd286..9ab246c 100644 --- a/go/linked_list_cycle.go +++ b/go/linked_list_cycle.go @@ -2,13 +2,13 @@ package main func hasCycleMap(head *ListNode) bool { - seen := make(map[*ListNode]struct{}) + visited := make(map[*ListNode]struct{}) node := head for node != nil { - if _, ok := seen[node]; ok { + if _, ok := visited[node]; ok { return true } - seen[node] = struct{}{} + visited[node] = struct{}{} node = node.Next } return false From e7538d4a98d3c7500dae4a19154adb34ff6139a2 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 2 Nov 2024 14:22:15 +0900 Subject: [PATCH 363/396] refactor Implement Queue using Stacks --- go/implement_queue_using_stacks.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/go/implement_queue_using_stacks.go b/go/implement_queue_using_stacks.go index fa2c849..9d45b05 100644 --- a/go/implement_queue_using_stacks.go +++ b/go/implement_queue_using_stacks.go @@ -22,11 +22,12 @@ func (q *MyQueue) Pop() int { } func (q *MyQueue) Peek() int { - if len(q.popStack) == 0 { - for len(q.pushStack) > 0 { - q.popStack = append(q.popStack, q.pushStack[len(q.pushStack)-1]) - q.pushStack = q.pushStack[:len(q.pushStack)-1] - } + if len(q.popStack) > 0 { + return q.popStack[len(q.popStack)-1] + } + for len(q.pushStack) > 0 { + q.popStack = append(q.popStack, q.pushStack[len(q.pushStack)-1]) + q.pushStack = q.pushStack[:len(q.pushStack)-1] } return q.popStack[len(q.popStack)-1] } From fe34990216e031ba84dd783556a2d96eb8b3ed9b Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 2 Nov 2024 17:23:43 +0900 Subject: [PATCH 364/396] fix --- go/climbing_stairs.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/go/climbing_stairs.go b/go/climbing_stairs.go index 9b075cc..292312d 100644 --- a/go/climbing_stairs.go +++ b/go/climbing_stairs.go @@ -1,7 +1,7 @@ //lint:file-ignore U1000 Ignore all unused code package main -func climbStairsFibonacci(n int) int { +func climbStairsDP(n int) int { prev, curr := 0, 1 for i := 1; i <= n; i++ { prev, curr = curr, prev+curr @@ -9,7 +9,7 @@ func climbStairsFibonacci(n int) int { return curr } -func climbStairsDP(n int) int { +func climbStairsmemorizedRecursion(n int) int { m := make(map[int]int, n) return climbStairsHelper(n, m) } From aca3148b3b77ccdc9d48fa5438c4afa58e1f4bbb Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 2 Nov 2024 17:45:30 +0900 Subject: [PATCH 365/396] refactor Reverse Linked List --- go/reverse_linked_list.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/go/reverse_linked_list.go b/go/reverse_linked_list.go index 0bd0747..f1d7c14 100644 --- a/go/reverse_linked_list.go +++ b/go/reverse_linked_list.go @@ -2,10 +2,12 @@ package main func reverseListIterative(head *ListNode) *ListNode { - curr := head var prev *ListNode + curr := head for curr != nil { - prev, curr, curr.Next = curr, curr.Next, prev + next := curr.Next + curr.Next = prev + prev, curr = curr, next } return prev } From 55d5be8512655d8e05699f8628f36e460c55d48c Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 2 Nov 2024 18:07:03 +0900 Subject: [PATCH 366/396] refactor Reverse Linked List --- go/reverse_linked_list.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/go/reverse_linked_list.go b/go/reverse_linked_list.go index f1d7c14..7559393 100644 --- a/go/reverse_linked_list.go +++ b/go/reverse_linked_list.go @@ -13,12 +13,12 @@ func reverseListIterative(head *ListNode) *ListNode { } func reverseListRecurssive(head *ListNode) *ListNode { - curr := head - if curr == nil || curr.Next == nil { - return curr + if head == nil || head.Next == nil { + return head } - next := curr.Next - reversedHead := reverseListRecurssive(next) - curr.Next, next.Next = nil, curr - return reversedHead + curr, next := head, head.Next + reversed := reverseListRecurssive(next) + next.Next = curr + curr.Next = nil + return reversed } From 82666834367d35c5849a92d3ff9c744ce1b10fb5 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 2 Nov 2024 18:16:15 +0900 Subject: [PATCH 367/396] delete merged pullrequests/* --- .../best_time_to_buy_and_sell_stock/step1.go | 18 ----- .../best_time_to_buy_and_sell_stock/step2.go | 16 ---- pullrequests/binary_search/step1.go | 38 ---------- pullrequests/binary_search/step2.go | 17 ----- pullrequests/climbing_stairs/step1.go | 22 ------ pullrequests/climbing_stairs/step2.go | 26 ------- pullrequests/combination_sum/step1.go | 30 -------- pullrequests/combination_sum/step2.go | 56 -------------- pullrequests/combination_sum/step3.go | 21 ------ pullrequests/combination_sum/step4.go | 56 -------------- pullrequests/contains_duplicate/step1.go | 25 ------- pullrequests/contains_duplicate/step2.go | 30 -------- pullrequests/contains_duplicate/step3.go | 13 ---- pullrequests/contains_duplicate/step4.go | 22 ------ pullrequests/group_anagrams/step1.go | 28 ------- pullrequests/group_anagrams/step2.go | 25 ------- pullrequests/group_anagrams/step3.go | 31 -------- pullrequests/group_anagrams/step4.go | 21 ------ pullrequests/group_anagrams/step5.go | 21 ------ .../implement_queue_using_stacks/step1.go | 57 --------------- .../implement_queue_using_stacks/step2.go | 43 ----------- .../implement_queue_using_stacks/step3.go | 47 ------------ pullrequests/invert_binary_tree/step1.go | 23 ------ pullrequests/invert_binary_tree/step2.go | 33 --------- pullrequests/invert_binary_tree/step3.go | 10 --- pullrequests/linked_list_cycle/step1.go | 29 -------- pullrequests/linked_list_cycle/step2.go | 24 ------ .../step1.go | 26 ------- .../step2.go | 23 ------ .../step3.go | 24 ------ .../step4.go | 14 ---- .../step1.go | 36 --------- .../step2.go | 32 -------- pullrequests/majority_element/step1.go | 24 ------ pullrequests/majority_element/step2.go | 28 ------- pullrequests/merge_two_sorted_lists/step1.go | 60 --------------- pullrequests/merge_two_sorted_lists/step2.go | 30 -------- pullrequests/merge_two_sorted_lists/step3.go | 73 ------------------- pullrequests/merge_two_sorted_lists/step4.go | 22 ------ pullrequests/merge_two_sorted_lists/step5.go | 22 ------ pullrequests/ransom_note/step1.go | 27 ------- pullrequests/ransom_note/step2.go | 20 ----- pullrequests/reverse_linked_list/step1.go | 32 -------- pullrequests/reverse_linked_list/step2.go | 27 ------- pullrequests/reverse_linked_list/step3.go | 47 ------------ pullrequests/reverse_linked_list/step4.go | 22 ------ pullrequests/search_insert_position/step1.go | 27 ------- pullrequests/search_insert_position/step2.go | 22 ------ pullrequests/search_insert_position/step3.go | 22 ------ pullrequests/search_insert_position/step4.go | 15 ---- pullrequests/string_to_integer_atoi/step1.go | 41 ----------- pullrequests/string_to_integer_atoi/step2.go | 40 ---------- pullrequests/string_to_integer_atoi/step3.go | 41 ----------- pullrequests/string_to_integer_atoi/step4.go | 41 ----------- pullrequests/two_sum/step1.go | 18 ----- pullrequests/two_sum/step2.go | 25 ------- pullrequests/two_sum/step3.go | 13 ---- pullrequests/valid_anagram/step1.go | 45 ------------ pullrequests/valid_anagram/step2.go | 41 ----------- pullrequests/valid_anagram/step3.go | 32 -------- pullrequests/valid_anagram/step4.go | 32 -------- pullrequests/zigzag_conversion/step1.go | 27 ------- pullrequests/zigzag_conversion/step2.go | 27 ------- pullrequests/zigzag_conversion/step3.go | 50 ------------- pullrequests/zigzag_conversion/step4.go | 47 ------------ 65 files changed, 1977 deletions(-) delete mode 100644 pullrequests/best_time_to_buy_and_sell_stock/step1.go delete mode 100644 pullrequests/best_time_to_buy_and_sell_stock/step2.go delete mode 100644 pullrequests/binary_search/step1.go delete mode 100644 pullrequests/binary_search/step2.go delete mode 100644 pullrequests/climbing_stairs/step1.go delete mode 100644 pullrequests/climbing_stairs/step2.go delete mode 100644 pullrequests/combination_sum/step1.go delete mode 100644 pullrequests/combination_sum/step2.go delete mode 100644 pullrequests/combination_sum/step3.go delete mode 100644 pullrequests/combination_sum/step4.go delete mode 100644 pullrequests/contains_duplicate/step1.go delete mode 100644 pullrequests/contains_duplicate/step2.go delete mode 100644 pullrequests/contains_duplicate/step3.go delete mode 100644 pullrequests/contains_duplicate/step4.go delete mode 100644 pullrequests/group_anagrams/step1.go delete mode 100644 pullrequests/group_anagrams/step2.go delete mode 100644 pullrequests/group_anagrams/step3.go delete mode 100644 pullrequests/group_anagrams/step4.go delete mode 100644 pullrequests/group_anagrams/step5.go delete mode 100644 pullrequests/implement_queue_using_stacks/step1.go delete mode 100644 pullrequests/implement_queue_using_stacks/step2.go delete mode 100644 pullrequests/implement_queue_using_stacks/step3.go delete mode 100644 pullrequests/invert_binary_tree/step1.go delete mode 100644 pullrequests/invert_binary_tree/step2.go delete mode 100644 pullrequests/invert_binary_tree/step3.go delete mode 100644 pullrequests/linked_list_cycle/step1.go delete mode 100644 pullrequests/linked_list_cycle/step2.go delete mode 100644 pullrequests/longest_substring_without_repeating_characters/step1.go delete mode 100644 pullrequests/longest_substring_without_repeating_characters/step2.go delete mode 100644 pullrequests/longest_substring_without_repeating_characters/step3.go delete mode 100644 pullrequests/longest_substring_without_repeating_characters/step4.go delete mode 100644 pullrequests/lowest_common_ancester_of_a_binary_search_tree/step1.go delete mode 100644 pullrequests/lowest_common_ancester_of_a_binary_search_tree/step2.go delete mode 100644 pullrequests/majority_element/step1.go delete mode 100644 pullrequests/majority_element/step2.go delete mode 100644 pullrequests/merge_two_sorted_lists/step1.go delete mode 100644 pullrequests/merge_two_sorted_lists/step2.go delete mode 100644 pullrequests/merge_two_sorted_lists/step3.go delete mode 100644 pullrequests/merge_two_sorted_lists/step4.go delete mode 100644 pullrequests/merge_two_sorted_lists/step5.go delete mode 100644 pullrequests/ransom_note/step1.go delete mode 100644 pullrequests/ransom_note/step2.go delete mode 100644 pullrequests/reverse_linked_list/step1.go delete mode 100644 pullrequests/reverse_linked_list/step2.go delete mode 100644 pullrequests/reverse_linked_list/step3.go delete mode 100644 pullrequests/reverse_linked_list/step4.go delete mode 100644 pullrequests/search_insert_position/step1.go delete mode 100644 pullrequests/search_insert_position/step2.go delete mode 100644 pullrequests/search_insert_position/step3.go delete mode 100644 pullrequests/search_insert_position/step4.go delete mode 100644 pullrequests/string_to_integer_atoi/step1.go delete mode 100644 pullrequests/string_to_integer_atoi/step2.go delete mode 100644 pullrequests/string_to_integer_atoi/step3.go delete mode 100644 pullrequests/string_to_integer_atoi/step4.go delete mode 100644 pullrequests/two_sum/step1.go delete mode 100644 pullrequests/two_sum/step2.go delete mode 100644 pullrequests/two_sum/step3.go delete mode 100644 pullrequests/valid_anagram/step1.go delete mode 100644 pullrequests/valid_anagram/step2.go delete mode 100644 pullrequests/valid_anagram/step3.go delete mode 100644 pullrequests/valid_anagram/step4.go delete mode 100644 pullrequests/zigzag_conversion/step1.go delete mode 100644 pullrequests/zigzag_conversion/step2.go delete mode 100644 pullrequests/zigzag_conversion/step3.go delete mode 100644 pullrequests/zigzag_conversion/step4.go diff --git a/pullrequests/best_time_to_buy_and_sell_stock/step1.go b/pullrequests/best_time_to_buy_and_sell_stock/step1.go deleted file mode 100644 index ad300d9..0000000 --- a/pullrequests/best_time_to_buy_and_sell_stock/step1.go +++ /dev/null @@ -1,18 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package besttimetobuyandsellstock - -/* -時間:4分30秒 - -走査している中で現在の値に対して最大の利益を取り得るのは今まで走査してきた中の最小値であるため、最小値を更新した後に、現在の値に対する利益を計算し、それが最大値であれば更新するようにしている。 - -解いた後に中の変数名と関数名が一緒になってしまっていることに気づいた。 -*/ -func maxProfitStep1(prices []int) int { - minPrice, maxValue := prices[0], 0 - for _, price := range prices { - minPrice = min(minPrice, price) - maxValue = max(maxValue, price-minPrice) - } - return maxValue -} diff --git a/pullrequests/best_time_to_buy_and_sell_stock/step2.go b/pullrequests/best_time_to_buy_and_sell_stock/step2.go deleted file mode 100644 index bb7f7c4..0000000 --- a/pullrequests/best_time_to_buy_and_sell_stock/step2.go +++ /dev/null @@ -1,16 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package besttimetobuyandsellstock - -import "math" - -/* -関数名と被らないように変数名を更新したのと、minPriceをmath.MaxIntで初期化することで、たとえ空の入力が渡されたとしてもエラーにならないようにした。 -*/ -func maxProfit(prices []int) int { - minPrice, maxValue := math.MaxInt, 0 - for _, price := range prices { - minPrice = min(minPrice, price) - maxValue = max(maxValue, price-minPrice) - } - return maxValue -} diff --git a/pullrequests/binary_search/step1.go b/pullrequests/binary_search/step1.go deleted file mode 100644 index 6c6300f..0000000 --- a/pullrequests/binary_search/step1.go +++ /dev/null @@ -1,38 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package binarysearch - -/* -時間:5分 -単なる二分探索だが、まだ少し実装がもたつく部分があり、体に定着するほどにはなっていないなと思いました。 -*/ -func binarySearchHalfClosed(nums []int, target int) int { - left, right := 0, len(nums) - for left < right { - mid := left + (right-left)/2 - if nums[mid] == target { - return mid - } - if target < nums[mid] { - right = mid - } else { - left = mid + 1 - } - } - return -1 -} - -func binarySearchClosed(nums []int, target int) int { - left, right := 0, len(nums)-1 - for left <= right { - mid := left + (right-left)/2 - if nums[mid] == target { - return mid - } - if target < nums[mid] { - right = mid - 1 - } else { - left = mid + 1 - } - } - return -1 -} diff --git a/pullrequests/binary_search/step2.go b/pullrequests/binary_search/step2.go deleted file mode 100644 index 27e6a7d..0000000 --- a/pullrequests/binary_search/step2.go +++ /dev/null @@ -1,17 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package binarysearch - -import "sort" - -/* -PythonのbisectみたいなものがGoにもないかと調べたところ、sort.Search関数が使えそうだったので実装してみました。 -*/ -func search(nums []int, target int) int { - index := sort.Search(len(nums), func(i int) bool { - return nums[i] >= target - }) - if index < len(nums) && nums[index] == target { - return index - } - return -1 -} diff --git a/pullrequests/climbing_stairs/step1.go b/pullrequests/climbing_stairs/step1.go deleted file mode 100644 index 857187d..0000000 --- a/pullrequests/climbing_stairs/step1.go +++ /dev/null @@ -1,22 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package climbingstairs - -/* -レビュワーの方へ: - - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 -*/ - -/* -時間:11分 - -フィボナッチだとわかったので、その方法で解いた。 -少し頭がこんがらがってしまったので時間がかかってしまった。 -本来はn <= 0のときはエラーにするなどすべきだと思う。 -*/ -func climbStairsFibonacci(n int) int { - prev, curr := 0, 1 - for i := 1; i <= n; i++ { - prev, curr = curr, prev+curr - } - return curr -} diff --git a/pullrequests/climbing_stairs/step2.go b/pullrequests/climbing_stairs/step2.go deleted file mode 100644 index 6bedbe1..0000000 --- a/pullrequests/climbing_stairs/step2.go +++ /dev/null @@ -1,26 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package climbingstairs - -/* -レビュワーの方へ: - - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 -*/ - -/* -Step1の方法はどちらかというと特殊で、メモ化再帰を使った動的計画法で解くのが本命のような気がしたので、こちらでも解いた。 -*/ -func climbStairsDP(n int) int { - m := make(map[int]int, n) - return climbStairsHelper(n, m) -} - -func climbStairsHelper(n int, m map[int]int) int { - if n == 1 || n == 2 { - return n - } - if ways, ok := m[n]; ok { - return ways - } - m[n] = climbStairsHelper(n-1, m) + climbStairsHelper(n-2, m) - return m[n] -} diff --git a/pullrequests/combination_sum/step1.go b/pullrequests/combination_sum/step1.go deleted file mode 100644 index 31819b8..0000000 --- a/pullrequests/combination_sum/step1.go +++ /dev/null @@ -1,30 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package template - -/* -時間:24分 -少し前にバックトラッキングの問題を解いたので、ある条件を満たす全ての組み合わせを求めるためにバックトラッキングを使って解きました。 -*/ -func combinationSumStep1(candidates []int, target int) [][]int { - var combinations [][]int - var stack []int - var findCombinations func(int, int) - findCombinations = func(curr int, sum int) { - if sum == target { - combination := make([]int, len(stack)) - copy(combination, stack) - combinations = append(combinations, combination) - return - } - if sum > target { - return - } - for i := curr; i < len(candidates); i++ { - stack = append(stack, candidates[i]) - findCombinations(i, sum+candidates[i]) - stack = stack[:len(stack)-1] - } - } - findCombinations(0, 0) - return combinations -} diff --git a/pullrequests/combination_sum/step2.go b/pullrequests/combination_sum/step2.go deleted file mode 100644 index 28644ff..0000000 --- a/pullrequests/combination_sum/step2.go +++ /dev/null @@ -1,56 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package template - -/* -Step1では再帰を使ってバックトラッキングを解いたので、スタックを使った方法も実装しました。 -また、Step1の実装のリファクタもしました。 -*/ -func combinationSumBacktrackingStack(candidates []int, target int) [][]int { - combinations := [][]int{} - type state struct { - combination []int - sum int - index int - } - stack := []state{{[]int{}, 0, 0}} - for len(stack) > 0 { - current := stack[len(stack)-1] - stack = stack[:len(stack)-1] - if current.sum == target { - combinations = append(combinations, append([]int{}, current.combination...)) - continue - } - for i := current.index; i < len(candidates); i++ { - newSum := current.sum + candidates[i] - if newSum > target { - continue - } - newCombination := append([]int{}, current.combination...) - newCombination = append(newCombination, candidates[i]) - stack = append(stack, state{newCombination, newSum, i}) - } - } - return combinations -} - -func combinationSumBacktrackingRecursion(candidates []int, target int) [][]int { - var combinations [][]int - var stack []int - var generateCombinations func(int, int) - generateCombinations = func(currentIndex int, sum int) { - if sum == target { - combinations = append(combinations, append([]int{}, stack...)) - return - } - if sum > target { - return - } - for i := currentIndex; i < len(candidates); i++ { - stack = append(stack, candidates[i]) - generateCombinations(i, sum+candidates[i]) - stack = stack[:len(stack)-1] - } - } - generateCombinations(0, 0) - return combinations -} diff --git a/pullrequests/combination_sum/step3.go b/pullrequests/combination_sum/step3.go deleted file mode 100644 index 13715f3..0000000 --- a/pullrequests/combination_sum/step3.go +++ /dev/null @@ -1,21 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package template - -/* -動的計画法を使った方法も実装しました。 -targetごとに組み合わせを求めると重複する組み合わせが生じてしまうので、candidateごとに組み合わせを求めるようにしました。 -*/ -func combinationSumDP(candidates []int, target int) [][]int { - combinationsGroups := make([][][]int, target+1) - combinationsGroups[0] = [][]int{{}} - for _, candidate := range candidates { - for i := candidate; i <= target; i++ { - for _, combination := range combinationsGroups[i-candidate] { - newCombination := append([]int{}, combination...) - newCombination = append(newCombination, candidate) - combinationsGroups[i] = append(combinationsGroups[i], newCombination) - } - } - } - return combinationsGroups[target] -} diff --git a/pullrequests/combination_sum/step4.go b/pullrequests/combination_sum/step4.go deleted file mode 100644 index 43e04ef..0000000 --- a/pullrequests/combination_sum/step4.go +++ /dev/null @@ -1,56 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package template - -/* -Step1では再帰を使ってバックトラッキングを解いたので、スタックを使った方法も実装しました。 -また、Step1の実装のリファクタもしました。 -*/ -func combinationSumBacktrackingStackStep4(candidates []int, target int) [][]int { - combinations := [][]int{} - type state struct { - combination []int - sum int - index int - } - stack := []state{{[]int{}, 0, 0}} - for len(stack) > 0 { - current := stack[len(stack)-1] - stack = stack[:len(stack)-1] - if current.sum == target { - combinations = append(combinations, current.combination) - continue - } - for i := current.index; i < len(candidates); i++ { - newSum := current.sum + candidates[i] - if newSum > target { - continue - } - newCombination := append([]int{}, current.combination...) - newCombination = append(newCombination, candidates[i]) - stack = append(stack, state{newCombination, newSum, i}) - } - } - return combinations -} - -func combinationSumBacktrackingRecursionStep4(candidates []int, target int) [][]int { - var combinations [][]int - var stack []int - var generateCombinations func(int, int) - generateCombinations = func(currentIndex int, sum int) { - if sum == target { - combinations = append(combinations, append([]int{}, stack...)) - return - } - if sum > target { - return - } - for i := currentIndex; i < len(candidates); i++ { - stack = append(stack, candidates[i]) - generateCombinations(i, sum+candidates[i]) - stack = stack[:len(stack)-1] - } - } - generateCombinations(0, 0) - return combinations -} diff --git a/pullrequests/contains_duplicate/step1.go b/pullrequests/contains_duplicate/step1.go deleted file mode 100644 index 6db8956..0000000 --- a/pullrequests/contains_duplicate/step1.go +++ /dev/null @@ -1,25 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package containsduplicate - -/* -かなり前に解いたときのもの(コミット履歴からとってきました)なので -詳細は忘れてしまいました(すいません)。 -基本的にはマップを使って重複を見つけようとしています。 - -- Step1の要素数が1以下の場合の処理はなくても変わらないことに気づいたのでStep2ではなくしています。 -- valueの意味でvを使ったのですが、nのほうがnumsと対応していてより良いかなと思ったので同様にStep2ではnを使うようにしました。 -- nmもnumsMapのつもりで使ったのですが同様に他にマップが使われているわけではないのでStep2では単にmとしました。 -*/ -func containsDuplicateStep1(nums []int) bool { - if len(nums) <= 1 { - return false - } - nm := make(map[int]struct{}) - for _, v := range nums { - if _, ok := nm[v]; ok { - return true - } - nm[v] = struct{}{} - } - return false -} diff --git a/pullrequests/contains_duplicate/step2.go b/pullrequests/contains_duplicate/step2.go deleted file mode 100644 index 23c3c69..0000000 --- a/pullrequests/contains_duplicate/step2.go +++ /dev/null @@ -1,30 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package containsduplicate - -/* -時間:1分 -よりシンプルに書くようにしました。 -また他の解法として最後に要素数を比較する方法もあると思います。 - -質問 -- m, nという変数名をどう思いますか?(個人的にはこれぐらいの短いコードであれば逆に長い変数名をつけるのも良くないのではと思ったためあえて一文字の変数を使いました) -- 2つの解法のうちどちらのがほうが良いと思いますか?(個人的には下の解法はコード数が短くなるものの、必ずnumsを全て見ないといけないので、その点で若干パフォーマンスは劣るのかなと思っています。気にしなくても良いぐらいの話かもしれませんが、、) -*/ -func containsDuplicateStep2(nums []int) bool { - m := make(map[int]struct{}) - for _, n := range nums { - if _, ok := m[n]; ok { - return true - } - m[n] = struct{}{} - } - return false -} - -func containsDuplicate2Step2(nums []int) bool { - m := make(map[int]struct{}) - for _, n := range nums { - m[n] = struct{}{} - } - return len(nums) > len(m) -} diff --git a/pullrequests/contains_duplicate/step3.go b/pullrequests/contains_duplicate/step3.go deleted file mode 100644 index ca54f69..0000000 --- a/pullrequests/contains_duplicate/step3.go +++ /dev/null @@ -1,13 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package containsduplicate - -func containsDuplicateStep3(nums []int) bool { - seen := make(map[int]struct{}) - for _, n := range nums { - if _, ok := seen[n]; ok { - return true - } - seen[n] = struct{}{} - } - return false -} diff --git a/pullrequests/contains_duplicate/step4.go b/pullrequests/contains_duplicate/step4.go deleted file mode 100644 index 15c6592..0000000 --- a/pullrequests/contains_duplicate/step4.go +++ /dev/null @@ -1,22 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package containsduplicate - -func containsDuplicateStep4(nums []int) bool { - seen := make(map[int]struct{}) - for _, n := range nums { - if _, ok := seen[n]; ok { - return true - } - seen[n] = struct{}{} - } - return false -} - -// 若干トリッキーで意図がわかりづらいので上の方がベター -func containsDuplicate2Step4(nums []int) bool { - numsMap := make(map[int]struct{}) - for _, n := range nums { - numsMap[n] = struct{}{} - } - return len(nums) > len(numsMap) -} diff --git a/pullrequests/group_anagrams/step1.go b/pullrequests/group_anagrams/step1.go deleted file mode 100644 index 5607019..0000000 --- a/pullrequests/group_anagrams/step1.go +++ /dev/null @@ -1,28 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package groupanagrams - -/* - すぐに思いついたのはソートした文字列をkeyとしてハッシュテーブルを使ってグルーピングすること。 - ただ、クイックソートの平均計算量はO(n log n)なので、O(n)でできればやりたいと思い、前に似た - ような問題を解いたことがあったので、与えられた条件に小文字しか使われないと書いてあったので、 - 配列のインデックスを用いて頻度を取得し、keyにすることにした。 -*/ - -func groupAnagramsStep1(strs []string) [][]string { - m := make(map[[26]int][]string) - for _, s := range strs { - var freq [26]int - for _, r := range s { - freq[r-'a']++ - } - m[freq] = append(m[freq], s) - } - - result := make([][]string, len(m)) - i := 0 - for _, v := range m { - result[i] = v - i++ - } - return result -} diff --git a/pullrequests/group_anagrams/step2.go b/pullrequests/group_anagrams/step2.go deleted file mode 100644 index 0381a92..0000000 --- a/pullrequests/group_anagrams/step2.go +++ /dev/null @@ -1,25 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package groupanagrams - -/* - 変数名を改善した。 -*/ - -func groupAnagramsStep2(strs []string) [][]string { - m := make(map[[26]int][]string) - for _, s := range strs { - var freq [26]int - for _, r := range s { - freq[r-'a']++ - } - m[freq] = append(m[freq], s) - } - - res := make([][]string, len(m)) - i := 0 - for _, v := range m { - res[i] = v - i++ - } - return res -} diff --git a/pullrequests/group_anagrams/step3.go b/pullrequests/group_anagrams/step3.go deleted file mode 100644 index 9e3d95d..0000000 --- a/pullrequests/group_anagrams/step3.go +++ /dev/null @@ -1,31 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package groupanagrams - -/* - 時間:3分 - 変数名をリファクタした。 - - 質問: - - resという変数名をどう思いますか? - - mという変数名をどう思いますか?(mapのmです) - - wordsという変数名をどう思いますか? -*/ - -func groupAnagramsStep3(strs []string) [][]string { - m := make(map[[26]int][]string) - for _, word := range strs { - var freq [26]int - for _, r := range word { - freq[r-'a']++ - } - m[freq] = append(m[freq], word) - } - - res := make([][]string, len(m)) - i := 0 - for _, words := range m { - res[i] = words - i++ - } - return res -} diff --git a/pullrequests/group_anagrams/step4.go b/pullrequests/group_anagrams/step4.go deleted file mode 100644 index 82ad9f5..0000000 --- a/pullrequests/group_anagrams/step4.go +++ /dev/null @@ -1,21 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package groupanagrams - -func groupAnagramsStep4(strs []string) [][]string { - anagramsMap := make(map[[26]int][]string) - for _, word := range strs { - var frequency [26]int - for _, r := range word { - frequency[r-'a']++ - } - anagramsMap[frequency] = append(anagramsMap[frequency], word) - } - - anagrams := make([][]string, len(anagramsMap)) - i := 0 - for _, words := range anagramsMap { - anagrams[i] = words - i++ - } - return anagrams -} diff --git a/pullrequests/group_anagrams/step5.go b/pullrequests/group_anagrams/step5.go deleted file mode 100644 index 8fd20a9..0000000 --- a/pullrequests/group_anagrams/step5.go +++ /dev/null @@ -1,21 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package groupanagrams - -func groupAnagramsStep5(strs []string) [][]string { - anagramsMap := make(map[[26]int][]string) - for _, word := range strs { - var frequencies [26]int - for _, r := range word { - frequencies[r-'a']++ - } - anagramsMap[frequencies] = append(anagramsMap[frequencies], word) - } - - anagrams := make([][]string, len(anagramsMap)) - i := 0 - for _, words := range anagramsMap { - anagrams[i] = words - i++ - } - return anagrams -} diff --git a/pullrequests/implement_queue_using_stacks/step1.go b/pullrequests/implement_queue_using_stacks/step1.go deleted file mode 100644 index 0ebd590..0000000 --- a/pullrequests/implement_queue_using_stacks/step1.go +++ /dev/null @@ -1,57 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package template - -/* -レビュワーの方へ: - - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 -*/ - -/* -時間:15分 - -スタックを2つ使ってキューを実装する方法を知っていたので解法自体はすぐに思いついた。 -LeetCodeの問題としてはPopやPeekは必ず有効な時に呼ばれるとのことなので、エラー処理をする必要はなく、プロトタイプ宣言自体もerrorを返せるようになっていないが、個人的にエラー処理をしないと気持ち悪かったので、変なエラー処理っぽいことをした中途半端なコードになってしまった。 - -末尾についているStep1は提出用につけただけなので無視してください。 -*/ -type MyQueueStep1 struct { - pushStack []int - popStack []int -} - -func ConstructorStep1() MyQueueStep1 { - var q MyQueueStep1 - return q -} - -func (this *MyQueueStep1) Push(x int) { - this.pushStack = append(this.pushStack, x) -} - -func (this *MyQueueStep1) Pop() int { - this.Peek() - if len(this.popStack) > 0 { - x := this.popStack[len(this.popStack)-1] - this.popStack = this.popStack[:len(this.popStack)-1] - return x - } - return 0 -} - -func (this *MyQueueStep1) Peek() int { - if len(this.popStack) <= 0 { - for len(this.pushStack) > 0 { - x := this.pushStack[len(this.pushStack)-1] - this.pushStack = this.pushStack[:len(this.pushStack)-1] - this.popStack = append(this.popStack, x) - } - } - if len(this.popStack) > 0 { - return this.popStack[len(this.popStack)-1] - } - return 0 -} - -func (this *MyQueueStep1) Empty() bool { - return len(this.pushStack) <= 0 && len(this.popStack) <= 0 -} diff --git a/pullrequests/implement_queue_using_stacks/step2.go b/pullrequests/implement_queue_using_stacks/step2.go deleted file mode 100644 index 0a2be0e..0000000 --- a/pullrequests/implement_queue_using_stacks/step2.go +++ /dev/null @@ -1,43 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package template - -/* -レビュワーの方へ: - - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 -*/ - -/* -LeetCodeに通すことだけを考えてちゃんと綺麗に書いてみた。 -*/ -type MyQueueStep2 struct { - pushStack []int - popStack []int -} - -func ConstructorStep2() MyQueueStep2 { - return MyQueueStep2{} -} - -func (q *MyQueueStep2) Push(n int) { - q.pushStack = append(q.pushStack, n) -} - -func (q *MyQueueStep2) Pop() int { - n := q.Peek() - q.popStack = q.popStack[:len(q.popStack)-1] - return n -} - -func (q *MyQueueStep2) Peek() int { - if len(q.popStack) == 0 { - for len(q.pushStack) > 0 { - q.popStack = append(q.popStack, q.pushStack[len(q.pushStack)-1]) - q.pushStack = q.pushStack[:len(q.pushStack)-1] - } - } - return q.popStack[len(q.popStack)-1] -} - -func (q *MyQueueStep2) Empty() bool { - return len(q.pushStack) == 0 && len(q.popStack) == 0 -} diff --git a/pullrequests/implement_queue_using_stacks/step3.go b/pullrequests/implement_queue_using_stacks/step3.go deleted file mode 100644 index f149e83..0000000 --- a/pullrequests/implement_queue_using_stacks/step3.go +++ /dev/null @@ -1,47 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package template - -import "fmt" - -/* -レビュワーの方へ: - - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 -*/ - -/* -実際にLeetCodeの制約を無視できる場合のコードも書いてみた(本来であれば`container/list`を使えば良いという話だが、そこは一応LeetCodeで提示されている形から極力変えずに書いた)。 -*/ -type Queue struct { - pushStack []int - popStack []int -} - -func (q *Queue) Push(n int) { - q.pushStack = append(q.pushStack, n) -} - -func (q *Queue) Pop() (int, error) { - n, err := q.Peek() - if err != nil { - return 0, fmt.Errorf("queue is empty, cannot pop") - } - q.popStack = q.popStack[:len(q.popStack)-1] - return n, nil -} - -func (q *Queue) Peek() (int, error) { - if q.Empty() { - return 0, fmt.Errorf("queue is empty, cannot peek") - } - if len(q.popStack) == 0 { - for len(q.pushStack) > 0 { - q.popStack = append(q.popStack, q.pushStack[len(q.pushStack)-1]) - q.pushStack = q.pushStack[:len(q.pushStack)-1] - } - } - return q.popStack[len(q.popStack)-1], nil -} - -func (q *Queue) Empty() bool { - return len(q.pushStack) == 0 && len(q.popStack) == 0 -} diff --git a/pullrequests/invert_binary_tree/step1.go b/pullrequests/invert_binary_tree/step1.go deleted file mode 100644 index baae19d..0000000 --- a/pullrequests/invert_binary_tree/step1.go +++ /dev/null @@ -1,23 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package invertbinarytree - -type TreeNode struct { - Val int - Left *TreeNode - Right *TreeNode -} - -/* -時間:3分30秒 - -再帰的に左右のノードを入れ替えていけば良いというのにはすぐに気づき、すんなり実装することができた。 -*/ -func invertTreeStep1(root *TreeNode) *TreeNode { - if root == nil { - return nil - } - invertTreeStep1(root.Left) - invertTreeStep1(root.Right) - root.Left, root.Right = root.Right, root.Left - return root -} diff --git a/pullrequests/invert_binary_tree/step2.go b/pullrequests/invert_binary_tree/step2.go deleted file mode 100644 index 8b4171c..0000000 --- a/pullrequests/invert_binary_tree/step2.go +++ /dev/null @@ -1,33 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package invertbinarytree - -/* -Step1は冗長だったのでリファクタした。 -これぐらい短いと早期リターンしなくても良いかなと思い下記のようにしました。 -またイテレーティブに解く方法も実装しました。 -*/ -func invertTreeStep2(root *TreeNode) *TreeNode { - if root != nil { - root.Left, root.Right = invertTreeStep2(root.Right), invertTreeStep2(root.Left) - } - return root -} - -func invertTreeIterative(root *TreeNode) *TreeNode { - if root == nil { - return nil - } - stack := []*TreeNode{root} - for len(stack) > 0 { - node := stack[len(stack)-1] - stack = stack[:len(stack)-1] - node.Left, node.Right = node.Right, node.Left - if node.Left != nil { - stack = append(stack, node.Left) - } - if node.Right != nil { - stack = append(stack, node.Right) - } - } - return root -} diff --git a/pullrequests/invert_binary_tree/step3.go b/pullrequests/invert_binary_tree/step3.go deleted file mode 100644 index e5d894e..0000000 --- a/pullrequests/invert_binary_tree/step3.go +++ /dev/null @@ -1,10 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package invertbinarytree - -func invertTreeRecursive(root *TreeNode) *TreeNode { - if root == nil { - return nil - } - root.Left, root.Right = invertTreeRecursive(root.Right), invertTreeRecursive(root.Left) - return root -} diff --git a/pullrequests/linked_list_cycle/step1.go b/pullrequests/linked_list_cycle/step1.go deleted file mode 100644 index 3ac8934..0000000 --- a/pullrequests/linked_list_cycle/step1.go +++ /dev/null @@ -1,29 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package linkedlistcycle - -type ListNode struct { - Val int - Next *ListNode -} - -/* -レビュワーの方へ: - - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 -*/ - -/* -時間:5分 - -この問題を見たことがあり、フロイドの循環検出法を知っていたため、その方法で解いてみた。 -`slow == fast`ではポインタ同士を比較しているため、同一のオブジェクトであることを確認できる。 -*/ -func hasCycleFloyd(head *ListNode) bool { - slow, fast := head, head - for fast != nil && fast.Next != nil { - slow, fast = slow.Next, fast.Next.Next - if slow == fast { - return true - } - } - return false -} diff --git a/pullrequests/linked_list_cycle/step2.go b/pullrequests/linked_list_cycle/step2.go deleted file mode 100644 index 8bfb50b..0000000 --- a/pullrequests/linked_list_cycle/step2.go +++ /dev/null @@ -1,24 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package linkedlistcycle - -/* -レビュワーの方へ: - - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 -*/ - -/* -他に既に訪ねたノードのリストを保持しておく方法も考えられる。 -ノードのポインタ(メモリアドレス)をキーとしている。 -*/ -func hasCycleMap(head *ListNode) bool { - seen := make(map[*ListNode]struct{}) - node := head - for node != nil { - if _, ok := seen[node]; ok { - return true - } - seen[node] = struct{}{} - node = node.Next - } - return false -} diff --git a/pullrequests/longest_substring_without_repeating_characters/step1.go b/pullrequests/longest_substring_without_repeating_characters/step1.go deleted file mode 100644 index fe11637..0000000 --- a/pullrequests/longest_substring_without_repeating_characters/step1.go +++ /dev/null @@ -1,26 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package longestsubstringwithoutrepeatingcharacters - -/* -時間:34分 -最初に下記のやり方でやることを思いついたが、もう少し賢いやり方があるのではないかと10分ぐらい考えてしまい、思いつかなかったので、とりあえず書こうと思い、書きました。結果的には他の人のコードも見たりする限り、この方法で良かったのだとわかりました。 -*/ -func lengthOfLongestSubstring_step1(s string) int { - maxLen := 0 - head := 0 - m := make(map[rune]struct{}) - for tail := 1; tail <= len(s); tail++ { - if _, ok := m[rune(s[tail-1])]; ok { - for s[head] != s[tail-1] { - delete(m, rune(s[head])) - head++ - } - head++ - } else { - m[rune(s[tail-1])] = struct{}{} - } - substring := s[head:tail] - maxLen = max(maxLen, len(substring)) - } - return maxLen -} diff --git a/pullrequests/longest_substring_without_repeating_characters/step2.go b/pullrequests/longest_substring_without_repeating_characters/step2.go deleted file mode 100644 index 3641277..0000000 --- a/pullrequests/longest_substring_without_repeating_characters/step2.go +++ /dev/null @@ -1,23 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package longestsubstringwithoutrepeatingcharacters - -/* -より変数名をわかりやすくし、無駄な部分を消しました。 -*/ -func lengthOfLongestSubstring(s string) int { - maxLen, head := 0, 0 - inUse := make(map[byte]struct{}) - for tail := range s { - if _, ok := inUse[s[tail]]; ok { - for s[head] != s[tail] { - delete(inUse, s[head]) - head++ - } - head++ - } else { - inUse[s[tail]] = struct{}{} - } - maxLen = max(maxLen, tail-head+1) - } - return maxLen -} diff --git a/pullrequests/longest_substring_without_repeating_characters/step3.go b/pullrequests/longest_substring_without_repeating_characters/step3.go deleted file mode 100644 index 9f7f40f..0000000 --- a/pullrequests/longest_substring_without_repeating_characters/step3.go +++ /dev/null @@ -1,24 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package longestsubstringwithoutrepeatingcharacters - -/* -inUseの値にbool値を入れればよりシンプルに書けると思ったので、書き換えました。 - - - inUseの値に最後に見たインデックスを入れることも考えたが、どちらにせよ`delete(inUse, s[head])`でそこまでの文字を消していく必要があるので、意味がないのでは? - - head, tailか、left, rightのどちらの方がベターか。substringの先頭・末尾と捉えるのであれば前者、Two Pointersと捉えるのであれば後者?head, tailの方がinclusiveだとわかるのでより良いのでは?(https://github.com/sakzk/leetcode/pull/3#discussion_r1591191532) - - inUseという変数名はどうか? - ー 確かにsliding windowと捉えることもできる(https://github.com/sakzk/leetcode/pull/3#discussion_r1591194013) -*/ -func lengthOfLongestSubstring_step3(s string) int { - maxLen, head := 0, 0 - inUse := make(map[byte]bool) - for tail := range s { - for inUse[s[tail]] { - delete(inUse, s[head]) - head++ - } - inUse[s[tail]] = true - maxLen = max(maxLen, tail-head+1) - } - return maxLen -} diff --git a/pullrequests/longest_substring_without_repeating_characters/step4.go b/pullrequests/longest_substring_without_repeating_characters/step4.go deleted file mode 100644 index 300d2e3..0000000 --- a/pullrequests/longest_substring_without_repeating_characters/step4.go +++ /dev/null @@ -1,14 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package longestsubstringwithoutrepeatingcharacters - -func lengthOfLongestSubstring_step4(s string) int { - maxLength, left, seen := 0, 0, make(map[rune]int) - for right, r := range s { - if lastIndex, ok := seen[r]; ok && lastIndex >= left { - left = lastIndex + 1 - } - seen[r] = right - maxLength = max(maxLength, right-left+1) - } - return maxLength -} diff --git a/pullrequests/lowest_common_ancester_of_a_binary_search_tree/step1.go b/pullrequests/lowest_common_ancester_of_a_binary_search_tree/step1.go deleted file mode 100644 index 109c01b..0000000 --- a/pullrequests/lowest_common_ancester_of_a_binary_search_tree/step1.go +++ /dev/null @@ -1,36 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package lowestcommonancesterofabinarysearchtree - -type TreeNode struct { - Val int - Left *TreeNode - Right *TreeNode -} - -/* -時間:6分30秒 - -ルートから見ていく時、共通の祖先になっていないときは必ず、pとqは左か右のどちらかの同じ部分木にいるはず。pとqの間の値になったら共通の祖先になったとわかる。 - -本来は見つからなかった場合は返り値としてerrorを返したかったのですが、LeetCodeの制約上変えられないのでnilを返すようにしています。 - -該当ノードが見つからなかったからといってプログラムの実行の継続が困難になるわけではないと思うので、panicやlog.Panicを使うのはやり過ぎだと思います。 -場合によっては絶対に見つからないことが起こる入力はしないはずだと言える状況であればlog.Fatalを使ってログに書き込んだ後にos.Exit(1)を呼び出してプログラムを終了させるのが良い可能性もありますが、それも通常の場合やりすぎな気がします。 -他にはlog.Printなどを使ってログに見つからなかったことを記録しても良いかもしれませんが、見つからないことが起こる入力があり得るのであれば単にerrorを返り値として返して呼び出し側で処理するのが良いと思っています。 -他には単に見つからなかった場合はnilを返すなども手としてはあると思いますが、そうする場合は呼び出し側にもわかるようにコメント等で書いておいて欲しいなと思います。 -*/ -func lowestCommonAncestorIterativeStep1(root, p, q *TreeNode) *TreeNode { - node := root - for node != nil { - if p.Val <= node.Val && node.Val <= q.Val || q.Val <= node.Val && node.Val <= p.Val { - return node - } - if p.Val < node.Val && q.Val < node.Val { - node = node.Left - } - if node.Val < p.Val && node.Val < q.Val { - node = node.Right - } - } - return nil -} diff --git a/pullrequests/lowest_common_ancester_of_a_binary_search_tree/step2.go b/pullrequests/lowest_common_ancester_of_a_binary_search_tree/step2.go deleted file mode 100644 index 9c72e0b..0000000 --- a/pullrequests/lowest_common_ancester_of_a_binary_search_tree/step2.go +++ /dev/null @@ -1,32 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package lowestcommonancesterofabinarysearchtree - -/* -より見やすくなるようにリファクタしました。また、再帰を使った実装もしてみました。 -エラー処理についてはStep1と同様です。 -*/ -func lowestCommonAncestorIterative(root, p, q *TreeNode) *TreeNode { - node := root - for node != nil { - if p.Val < node.Val && q.Val < node.Val { - node = node.Left - continue - } - if node.Val < p.Val && node.Val < q.Val { - node = node.Right - continue - } - return node - } - return nil -} - -func lowestCommonAncestorRecursive(root, p, q *TreeNode) *TreeNode { - if p.Val < root.Val && q.Val < root.Val { - return lowestCommonAncestorRecursive(root.Left, p, q) - } - if root.Val < p.Val && root.Val < q.Val { - return lowestCommonAncestorRecursive(root.Right, p, q) - } - return root -} diff --git a/pullrequests/majority_element/step1.go b/pullrequests/majority_element/step1.go deleted file mode 100644 index 5b97467..0000000 --- a/pullrequests/majority_element/step1.go +++ /dev/null @@ -1,24 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package majorityelement - -/* -レビュワーの方へ: - - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 -*/ - -/* -時間:3分 - -一番自然な方法で解くことにした。 -最後にLeetCodeの制約上しょうがなく-1を返しているが、本当はerrorを返したい。 -*/ -func majorityElement(nums []int) int { - frequencies := make(map[int]int, len(nums)) - for _, n := range nums { - frequencies[n]++ - if frequencies[n] > len(nums)/2 { - return n - } - } - return -1 -} diff --git a/pullrequests/majority_element/step2.go b/pullrequests/majority_element/step2.go deleted file mode 100644 index b984784..0000000 --- a/pullrequests/majority_element/step2.go +++ /dev/null @@ -1,28 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package majorityelement - -/* -レビュワーの方へ: - - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 -*/ - -/* -時間:6分 - -Boyer-Moore Voteアルゴリズムでも解いてみた。このアルゴリズムもたまたま知っていたが、思い出しつつ書いたので少し時間がかかってしまった。 -*/ -func majorityElementBoyerMooreMajorityVote(nums []int) int { - candidate, count := nums[0], 0 - for _, n := range nums { - if n == candidate { - count++ - } else { - count-- - } - if count < 0 { - candidate = n - count = 0 - } - } - return candidate -} diff --git a/pullrequests/merge_two_sorted_lists/step1.go b/pullrequests/merge_two_sorted_lists/step1.go deleted file mode 100644 index 1bbe056..0000000 --- a/pullrequests/merge_two_sorted_lists/step1.go +++ /dev/null @@ -1,60 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package mergetwosortedlists - -/* - 個人的にLeetCodeを進めていて、2月ごろに解いたもの。GitHubのコミット履歴から引っ張ってきま - した。 - - 解いた時間を記録していなかったのですが、恐らく20~30分ぐらいかかった気がします。解いている途 - 中でポインタの向きがよくわからなくなってしまい、時間がかかってしまった記憶があります。また、 - Goの勉強も兼ねて書いたので、言語自体の知識も少ない状態で書きました。 - - 綺麗に書いている余裕がなかったので、とりあえず動くコードを書いたという感じです。とりあえず値 - の小さいノードから順番にポインタの向きを変えてマージしていけば良いとはわかったのですが、実装 - 力に余裕がなく、コードが冗長になってしまったという印象です。 -*/ - -type ListNode struct { - Val int - Next *ListNode -} - -func mergeTwoListsStep1(list1 *ListNode, list2 *ListNode) *ListNode { - if list1 == nil { - return list2 - } - if list2 == nil { - return list1 - } - - var res *ListNode - if list1.Val <= list2.Val { - res = list1 - list1 = list1.Next - } else { - res = list2 - list2 = list2.Next - } - - curNode := res - for { - if list1 == nil { - curNode.Next = list2 - return res - } - if list2 == nil { - curNode.Next = list1 - return res - } - - if list1.Val <= list2.Val { - curNode.Next = list1 - curNode = curNode.Next - list1 = list1.Next - } else { - curNode.Next = list2 - curNode = curNode.Next - list2 = list2.Next - } - } -} diff --git a/pullrequests/merge_two_sorted_lists/step2.go b/pullrequests/merge_two_sorted_lists/step2.go deleted file mode 100644 index 8d0ec46..0000000 --- a/pullrequests/merge_two_sorted_lists/step2.go +++ /dev/null @@ -1,30 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package mergetwosortedlists - -/* - 他の人のコードを色々見て、冗長な部分を消し、リファクタをしました。 -*/ - -func mergeTwoListsStep2(list1 *ListNode, list2 *ListNode) *ListNode { - dummy := new(ListNode) - cur := dummy - - for list1 != nil && list2 != nil { - if list1.Val <= list2.Val { - cur.Next = list1 - list1 = list1.Next - } else { - cur.Next = list2 - list2 = list2.Next - } - cur = cur.Next - } - - if list1 != nil { - cur.Next = list1 - } else { - cur.Next = list2 - } - - return dummy.Next -} diff --git a/pullrequests/merge_two_sorted_lists/step3.go b/pullrequests/merge_two_sorted_lists/step3.go deleted file mode 100644 index e29d0ac..0000000 --- a/pullrequests/merge_two_sorted_lists/step3.go +++ /dev/null @@ -1,73 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package mergetwosortedlists - -/* - 感想: - 現在(6月)解いたコードになります。大分余裕を持って書けるようになってきました。一番初めはポ - インタの向きがよくわからなくなるということがあったのですが、そういったこともなくなり、ポイ - ンタの操作を余裕を持って書けるようになってきました。暗記ではなく、自然と同じようなコードが - 出てくるようになりました。またGo自体も初期に比べて無理なく自然に書けるようになりました。 - - Step2に比べて変数名が改善されています(curではなくtailに変更)。また個人的にシンプルで見 - やすいと思っているので多重代入をよく使うようになりました。 - - また、個人的な感覚として、list1またはlist2のどちらか片方がnilの場合の処理をfor文の中に入 - れるか、外に出すかをその時の気分で意図的に変えるようになりました。 - - 質問したいこと: - - tailという変数名についてどう思いますか? - - 多重代入は使った方がシンプルで見やすいと個人的に思ってるのですがどう思いますか?もちろん - 互いに影響を与え合ってしまうような変数同士の場合は挙動がundefinedだと思うので避けるべき - だとは思いますが。 - - 個人的には上と下の回答はどちらも大差ないと思っていてどちらでも良いと思っているのですが、 - どう思いますか? -*/ - -func mergeTwoListsStep3(list1 *ListNode, list2 *ListNode) *ListNode { - dummy := new(ListNode) - tail := dummy - - for list1 != nil && list2 != nil { - if list1.Val < list2.Val { - tail.Next, list1 = list1, list1.Next - } else { - tail.Next, list2 = list2, list2.Next - } - tail = tail.Next - } - - if list1 != nil { - tail.Next = list1 - } - if list2 != nil { - tail.Next = list2 - } - - return dummy.Next -} - -func mergeTwoLists_step3_anothersolution(list1 *ListNode, list2 *ListNode) *ListNode { - dummy := new(ListNode) - tail := dummy - - for list1 != nil || list2 != nil { - if list1 == nil { - tail.Next = list2 - break - } - if list2 == nil { - tail.Next = list1 - break - } - - if list1.Val < list2.Val { - tail.Next, list1 = list1, list1.Next - } else { - tail.Next, list2 = list2, list2.Next - } - tail = tail.Next - tail.Next = nil - } - - return dummy.Next -} diff --git a/pullrequests/merge_two_sorted_lists/step4.go b/pullrequests/merge_two_sorted_lists/step4.go deleted file mode 100644 index e4c865c..0000000 --- a/pullrequests/merge_two_sorted_lists/step4.go +++ /dev/null @@ -1,22 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package mergetwosortedlists - -func mergeTwoListsStep4(list1 *ListNode, list2 *ListNode) *ListNode { - dummy := new(ListNode) - tail := dummy - for list1 != nil && list2 != nil { - if list1.Val < list2.Val { - tail.Next, list1 = list1, list1.Next - } else { - tail.Next, list2 = list2, list2.Next - } - tail = tail.Next - } - if list1 != nil { - tail.Next = list1 - } - if list2 != nil { - tail.Next = list2 - } - return dummy.Next -} diff --git a/pullrequests/merge_two_sorted_lists/step5.go b/pullrequests/merge_two_sorted_lists/step5.go deleted file mode 100644 index b2a267a..0000000 --- a/pullrequests/merge_two_sorted_lists/step5.go +++ /dev/null @@ -1,22 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package mergetwosortedlists - -func mergeTwoListsStep5(list1 *ListNode, list2 *ListNode) *ListNode { - dummy := &ListNode{} - tail := dummy - for list1 != nil && list2 != nil { - if list1.Val < list2.Val { - tail.Next, list1 = list1, list1.Next - } else { - tail.Next, list2 = list2, list2.Next - } - tail = tail.Next - } - if list1 != nil { - tail.Next = list1 - } - if list2 != nil { - tail.Next = list2 - } - return dummy.Next -} diff --git a/pullrequests/ransom_note/step1.go b/pullrequests/ransom_note/step1.go deleted file mode 100644 index c54d387..0000000 --- a/pullrequests/ransom_note/step1.go +++ /dev/null @@ -1,27 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package ransomnote - -/* -レビュワーの方へ: - - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 -*/ - -/* -時間:2分 -似たような問題を何回か解いたことがあるので特に困らなかった。 -入力が小文字に限らない場合は、runeをkeyとするmapを使えば良い。その際、Unicodeの扱いには気をつける必要がある。 -https://github.com/rihib/leetcode/pull/5#issue-2446890745 -*/ -func canConstructStep1(ransomNote string, magazine string) bool { - var frequency [26]int - for _, r := range magazine { - frequency[r-'a']++ - } - for _, r := range ransomNote { - frequency[r-'a']-- - if frequency[r-'a'] < 0 { - return false - } - } - return true -} diff --git a/pullrequests/ransom_note/step2.go b/pullrequests/ransom_note/step2.go deleted file mode 100644 index e531624..0000000 --- a/pullrequests/ransom_note/step2.go +++ /dev/null @@ -1,20 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package ransomnote - -/* -レビュワーの方へ: - - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 -*/ -func canConstructStep2(ransomNote string, magazine string) bool { - var frequencies [26]int - for _, r := range magazine { - frequencies[r-'a']++ - } - for _, r := range ransomNote { - frequencies[r-'a']-- - if frequencies[r-'a'] < 0 { - return false - } - } - return true -} diff --git a/pullrequests/reverse_linked_list/step1.go b/pullrequests/reverse_linked_list/step1.go deleted file mode 100644 index 817bbea..0000000 --- a/pullrequests/reverse_linked_list/step1.go +++ /dev/null @@ -1,32 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package reverselinkedlist - -/* -COMMENT -*/ - -type ListNode struct { - Val int - Next *ListNode -} - -func reverseList_step1(head *ListNode) *ListNode { - if head == nil { - return head - } - if head.Next == nil { - return head - } - - prev := head - next := head.Next - head.Next = nil - - for next != nil { - nextNext := next.Next - next.Next = prev - prev = next - next = nextNext - } - return prev -} diff --git a/pullrequests/reverse_linked_list/step2.go b/pullrequests/reverse_linked_list/step2.go deleted file mode 100644 index d484257..0000000 --- a/pullrequests/reverse_linked_list/step2.go +++ /dev/null @@ -1,27 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package reverselinkedlist - -/* -COMMENT -*/ - -func reverseList_step2(head *ListNode) *ListNode { - if head == nil { - return head - } - if head.Next == nil { - return head - } - - prev := head - curr := head.Next - head.Next = nil - - for curr != nil { - next := curr.Next - curr.Next = prev - prev = curr - curr = next - } - return prev -} diff --git a/pullrequests/reverse_linked_list/step3.go b/pullrequests/reverse_linked_list/step3.go deleted file mode 100644 index 1262387..0000000 --- a/pullrequests/reverse_linked_list/step3.go +++ /dev/null @@ -1,47 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package reverselinkedlist - -/* - 時間: 2分、2分 - イテレーティブな方法と再帰を使った方法の2通りで解きました。 - - 質問: - - 20行目について、1行にまとめているのですが、読みやすさなどの点ではどう思いますか? - - - 与えられたhead自体を操作するのは避けた方が良いか?(例えばcurrなどの別の変数に代入して - から操作した方が良いか) - - - 変数名としてreversedHeadか、reversedListHeadのどちらの方が良いか? - - reversedListHeadだとこれぐらいのコードの短さで使うにしては少し長すぎるかなと思った - のでここではreversedHeadでも十分通じると思い、これにしました - - 他の人のPRを見て思ったこと - - スタックを使って解く方法も確かにあるなと思いました。パフォーマンス的には再帰を使って解く - 方法とほぼ同じ?(再帰もスタックを使っていると言えば使っている) - - - スタックとヒープ - https://github.com/Ryotaro25/leetcode_first60/pull/8/files#r1617095525 - https://github.com/Ryotaro25/leetcode_first60/pull/8/files#r1616548694 - - - 再帰について - https://github.com/seal-azarashi/leetcode/pull/7/files#r1640157920 -*/ - -func reverseList_iterative_step3(head *ListNode) *ListNode { - var prev *ListNode - for head != nil { - prev, head, head.Next = head, head.Next, prev - } - return prev -} - -func reverseList_recurssive_step3(head *ListNode) *ListNode { - if head == nil || head.Next == nil { - return head - } - - next := head.Next - reversedHead := reverseList_recurssive_step3(next) - head.Next, next.Next = nil, head - return reversedHead -} diff --git a/pullrequests/reverse_linked_list/step4.go b/pullrequests/reverse_linked_list/step4.go deleted file mode 100644 index bff0146..0000000 --- a/pullrequests/reverse_linked_list/step4.go +++ /dev/null @@ -1,22 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package reverselinkedlist - -func reverseList_iterative_step4(head *ListNode) *ListNode { - curr := head - var prev *ListNode - for curr != nil { - prev, curr, curr.Next = curr, curr.Next, prev - } - return prev -} - -func reverseList_recurssive_step4(head *ListNode) *ListNode { - curr := head - if curr == nil || curr.Next == nil { - return curr - } - next := curr.Next - reversedHead := reverseList_recurssive_step4(next) - curr.Next, next.Next = nil, curr - return reversedHead -} diff --git a/pullrequests/search_insert_position/step1.go b/pullrequests/search_insert_position/step1.go deleted file mode 100644 index f500b57..0000000 --- a/pullrequests/search_insert_position/step1.go +++ /dev/null @@ -1,27 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package searchinsertposition - -/* -時間:12分 -解法自体はすぐに浮かんで解くことができた。 -その割に二分探索を書くのがまだ慣れていなくて少し時間がかかってしまった。 -*/ -func searchInsert_step1(nums []int, target int) int { - left, right := 0, len(nums) - var mid int - for left < right { - mid = (left + right) / 2 - if target == nums[mid] { - return mid - } - if target < nums[mid] { - right = mid - } else { - left = mid + 1 - } - } - if target < nums[mid] { - return mid - } - return mid + 1 -} diff --git a/pullrequests/search_insert_position/step2.go b/pullrequests/search_insert_position/step2.go deleted file mode 100644 index 63236c2..0000000 --- a/pullrequests/search_insert_position/step2.go +++ /dev/null @@ -1,22 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package searchinsertposition - -/* -最後の部分はleftを返せ馬良いと気づき変更した。 -その他もより読みやすいように直した。 -*/ -func searchInsert_step2(nums []int, target int) int { - left, right := 0, len(nums) - for left < right { - mid := (left + right) / 2 - if nums[mid] == target { - return mid - } - if nums[mid] < target { - left = mid + 1 - } else { - right = mid - } - } - return left -} diff --git a/pullrequests/search_insert_position/step3.go b/pullrequests/search_insert_position/step3.go deleted file mode 100644 index 86f7164..0000000 --- a/pullrequests/search_insert_position/step3.go +++ /dev/null @@ -1,22 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package searchinsertposition - -/* -オーバーフローを起こさないようにmidの計算方法を修正した -https://github.com/hayashi-ay/leetcode/blob/064fca989bc4ecf9c7bce70237524a3e7ab1a21a/35.%20Search%20Insert%20Position.md?plain=1#L6 -*/ -func searchInsert_step3(nums []int, target int) int { - left, right := 0, len(nums) - for left < right { - mid := left + (right-left)/2 - if nums[mid] == target { - return mid - } - if nums[mid] < target { - left = mid + 1 - } else { - right = mid - } - } - return left -} diff --git a/pullrequests/search_insert_position/step4.go b/pullrequests/search_insert_position/step4.go deleted file mode 100644 index 345396d..0000000 --- a/pullrequests/search_insert_position/step4.go +++ /dev/null @@ -1,15 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package searchinsertposition - -func searchInsert(nums []int, target int) int { - left, right := 0, len(nums) - for left < right { - mid := left + (right-left)/2 - if nums[mid] < target { - left = mid + 1 - } else { - right = mid - } - } - return left -} diff --git a/pullrequests/string_to_integer_atoi/step1.go b/pullrequests/string_to_integer_atoi/step1.go deleted file mode 100644 index 5aeee4a..0000000 --- a/pullrequests/string_to_integer_atoi/step1.go +++ /dev/null @@ -1,41 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package stringtointegeratoi - -import "math" - -/* -時間:20分 -解法自体はすぐに思いついたのですが、色々とバグを取り除くのに時間がかかってしまいました。 -*/ -func myAtoi_step1(s string) int { - const ( - intMax = int(math.MaxInt32) - intMin = int(math.MinInt32) - ) - sign := 1 - i := 0 - num := 0 - for i < len(s) && s[i] == ' ' { - i++ - } - if i < len(s) && (s[i] == '-' || s[i] == '+') { - if s[i] == '-' { - sign = -1 - } - i++ - } - for i < len(s) && s[i] == '0' { - i++ - } - for i < len(s) && '0' <= rune(s[i]) && rune(s[i]) <= '9' { - num = num*10 + int(rune(s[i])-'0') - if sign == 1 && num > intMax { - return intMax - } - if sign == -1 && -num < intMin { - return intMin - } - i++ - } - return num * sign -} diff --git a/pullrequests/string_to_integer_atoi/step2.go b/pullrequests/string_to_integer_atoi/step2.go deleted file mode 100644 index 73bc1fe..0000000 --- a/pullrequests/string_to_integer_atoi/step2.go +++ /dev/null @@ -1,40 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package stringtointegeratoi - -import "math" - -/* -Goではrune型はint32、byte型はint8のエイリアスで、明示的にキャストしなくても内部でキャストしてくれるので、そのまま比較できるため、rune型にキャストするのをやめました。 -*/ -func myAtoi_step2(s string) int { - const ( - intMax = int(math.MaxInt32) - intMin = int(math.MinInt32) - ) - - i := 0 - for i < len(s) && s[i] == ' ' { - i++ - } - - sign := 1 - if i < len(s) && (s[i] == '-' || s[i] == '+') { - if s[i] == '-' { - sign = -1 - } - i++ - } - - num := 0 - for i < len(s) && '0' <= s[i] && s[i] <= '9' { - num = num*10 + int(s[i]-'0') - if sign == 1 && num > intMax { - return intMax - } - if sign == -1 && -num < intMin { - return intMin - } - i++ - } - return sign * num -} diff --git a/pullrequests/string_to_integer_atoi/step3.go b/pullrequests/string_to_integer_atoi/step3.go deleted file mode 100644 index a34066a..0000000 --- a/pullrequests/string_to_integer_atoi/step3.go +++ /dev/null @@ -1,41 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package stringtointegeratoi - -import "math" - -/* -32bit環境でもオーバーフローしないようにコードを変えてみました。 -*/ -func myAtoi(s string) int { - const ( - intMax = int(math.MaxInt32) - intMin = int(math.MinInt32) - ) - - i := 0 - for i < len(s) && s[i] == ' ' { - i++ - } - - sign := 1 - if i < len(s) && (s[i] == '-' || s[i] == '+') { - if s[i] == '-' { - sign = -1 - } - i++ - } - - num := 0 - for i < len(s) && '0' <= s[i] && s[i] <= '9' { - next := int(s[i] - '0') - if sign != -1 && num > (intMax-next)/10 { - return intMax - } - if sign == -1 && -num < (intMin+next)/10 { - return intMin - } - num = num*10 + next - i++ - } - return sign * num -} diff --git a/pullrequests/string_to_integer_atoi/step4.go b/pullrequests/string_to_integer_atoi/step4.go deleted file mode 100644 index 74aa35c..0000000 --- a/pullrequests/string_to_integer_atoi/step4.go +++ /dev/null @@ -1,41 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package stringtointegeratoi - -import "math" - -/* -Step3のオーバーフローしてしまうバグを直しました。 -*/ -func myAtoi_step4(s string) int { - const ( - intMax = int(math.MaxInt32) - intMin = int(math.MinInt32) - ) - - i := 0 - for i < len(s) && s[i] == ' ' { - i++ - } - - sign := 1 - if i < len(s) && (s[i] == '-' || s[i] == '+') { - if s[i] == '-' { - sign = -1 - } - i++ - } - - num := 0 - for i < len(s) && '0' <= s[i] && s[i] <= '9' { - digit := int(s[i] - '0') - if sign == 1 && (num > intMax/10 || num == intMax/10 && digit >= intMax%10) { - return intMax - } - if sign == -1 && (-num < intMin/10 || -num == intMin/10 && -digit <= intMin%10) { - return intMin - } - num = num*10 + digit - i++ - } - return sign * num -} diff --git a/pullrequests/two_sum/step1.go b/pullrequests/two_sum/step1.go deleted file mode 100644 index ba27643..0000000 --- a/pullrequests/two_sum/step1.go +++ /dev/null @@ -1,18 +0,0 @@ -//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 deleted file mode 100644 index 7a8ea9e..0000000 --- a/pullrequests/two_sum/step2.go +++ /dev/null @@ -1,25 +0,0 @@ -//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 deleted file mode 100644 index dff0f34..0000000 --- a/pullrequests/two_sum/step3.go +++ /dev/null @@ -1,13 +0,0 @@ -//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を返したい -} diff --git a/pullrequests/valid_anagram/step1.go b/pullrequests/valid_anagram/step1.go deleted file mode 100644 index 5f67ef2..0000000 --- a/pullrequests/valid_anagram/step1.go +++ /dev/null @@ -1,45 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package validanagram - -/* -かなり前に解いたものなので、詳細については忘れてしましました。 -小文字のアルファベットのみが入力として与えられる場合と、Unicode文字も含まれる場合の2つの解法が含まれています。 - -基本的にはそれぞれの文字列に含まれる文字の種類と数が一致しているかを見ています。 -下の解法について、40行目で0未満になった場合のみfalseを返すのは一見おかしいように見えますが、30行目で文字数が等しいことを確認しているため、一方より多い文字があれば何かの文字は少なくなるはずであるため、ロジック的には問題ないと思います。 -*/ -func isAnagramStep1(s string, t string) bool { - if len(s) != len(t) { - return false - } - - var freq [26]int - for i := 0; i < len(s); i++ { - freq[s[i]-'a']++ - freq[t[i]-'a']-- - } - for _, v := range freq { - if v != 0 { - return false - } - } - return true -} - -func isAnagramUnicodeStep1(s string, t string) bool { - if len(s) != len(t) { - return false - } - - freq := make(map[rune]int) - for _, r := range s { - freq[r]++ - } - for _, r := range t { - freq[r]-- - if freq[r] < 0 { - return false - } - } - return true -} diff --git a/pullrequests/valid_anagram/step2.go b/pullrequests/valid_anagram/step2.go deleted file mode 100644 index 09f0307..0000000 --- a/pullrequests/valid_anagram/step2.go +++ /dev/null @@ -1,41 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package validanagram - -/* -よりシンプルにわかりやすく書くようにしました。例えばfreqのように省略するのではなくfrequencyにしました。 - -上については、Goの場合、s[i]のようにアクセスするとバイト列にアクセスすることになるので、今回の場合はたまたまascii文字しか入力として与えられないので問題ないのですが、あまりよろしくないと思ったので文字としてアクセスするように変更しました。 - -下の解法についてはStep1のロジックがわかりづらかったので、より明確になるように変更しました。 -*/ -func isAnagramStep2(s string, t string) bool { - var frequency [26]int - for _, r := range s { - frequency[r-'a']++ - } - for _, r := range t { - frequency[r-'a']-- - } - for _, n := range frequency { - if n != 0 { - return false - } - } - return true -} - -func isAnagramUnicodeStep2(s string, t string) bool { - frequency := make(map[rune]int) - for _, r := range s { - frequency[r]++ - } - for _, r := range t { - frequency[r]-- - } - for _, n := range frequency { - if n != 0 { - return false - } - } - return true -} diff --git a/pullrequests/valid_anagram/step3.go b/pullrequests/valid_anagram/step3.go deleted file mode 100644 index d781c83..0000000 --- a/pullrequests/valid_anagram/step3.go +++ /dev/null @@ -1,32 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package validanagram - -func isAnagramStep3(s string, t string) bool { - return frequency(s) == frequency(t) -} - -func frequency(s string) [26]int { - var f [26]int - for _, r := range s { - f[r-'a']++ - } - return f -} - -// ちゃんとUnicodeに対応させるなら結合文字などを考慮する必要がある -// https://github.com/rihib/leetcode/pull/5#discussion_r1706198268 -func isAnagramUnicodeStep3(s string, t string) bool { - frequency := make(map[rune]int) - for _, r := range s { - frequency[r]++ - } - for _, r := range t { - frequency[r]-- - } - for _, n := range frequency { - if n != 0 { - return false - } - } - return true -} diff --git a/pullrequests/valid_anagram/step4.go b/pullrequests/valid_anagram/step4.go deleted file mode 100644 index b63c510..0000000 --- a/pullrequests/valid_anagram/step4.go +++ /dev/null @@ -1,32 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package validanagram - -func isAnagramStep4(s string, t string) bool { - return frequencies(s) == frequencies(t) -} - -func frequencies(s string) [26]int { - var f [26]int - for _, r := range s { - f[r-'a']++ - } - return f -} - -// ちゃんとUnicodeに対応させるなら結合文字などを考慮する必要がある -// https://github.com/rihib/leetcode/pull/5#discussion_r1706198268 -func isAnagramUnicodeStep4(s string, t string) bool { - frequencies := make(map[rune]int) - for _, r := range s { - frequencies[r]++ - } - for _, r := range t { - frequencies[r]-- - } - for _, n := range frequencies { - if n != 0 { - return false - } - } - return true -} diff --git a/pullrequests/zigzag_conversion/step1.go b/pullrequests/zigzag_conversion/step1.go deleted file mode 100644 index 4888418..0000000 --- a/pullrequests/zigzag_conversion/step1.go +++ /dev/null @@ -1,27 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package zigzagconversion - -/* -時間:34分 -解法を思いつくのに時間がかかってしまいました(10分ぐらい?)。 -規則性を持っており、インデックスからどの行になるかを求めることができると思ったのでこの解法になりました。 -*/ -func convert_step1(s string, numRows int) string { - if numRows == 1 { - return s - } - var rows = make([][]rune, numRows) - for i, r := range s { - tmp := i % (numRows*2 - 2) - if tmp < numRows { - rows[tmp] = append(rows[tmp], r) - } else { - rows[2*numRows-tmp-2] = append(rows[2*numRows-tmp-2], r) - } - } - var res []rune - for _, row := range rows { - res = append(res, row...) - } - return string(res) -} diff --git a/pullrequests/zigzag_conversion/step2.go b/pullrequests/zigzag_conversion/step2.go deleted file mode 100644 index 7a8bc45..0000000 --- a/pullrequests/zigzag_conversion/step2.go +++ /dev/null @@ -1,27 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package zigzagconversion - -/* -より読みやすくなるようにリファクタしました。 -*/ -func convert_step2(s string, numRows int) string { - if numRows == 1 { - return s - } - - rows := make([][]rune, numRows) - cycleLen := 2*numRows - 2 - for i, r := range s { - rowNum := i % cycleLen - if rowNum >= numRows { - rowNum = cycleLen - rowNum - } - rows[rowNum] = append(rows[rowNum], r) - } - - var oneline []rune - for _, row := range rows { - oneline = append(oneline, row...) - } - return string(oneline) -} diff --git a/pullrequests/zigzag_conversion/step3.go b/pullrequests/zigzag_conversion/step3.go deleted file mode 100644 index 34152a3..0000000 --- a/pullrequests/zigzag_conversion/step3.go +++ /dev/null @@ -1,50 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package zigzagconversion - -import "strings" - -/* -文字列結合のパフォーマンスが良くなるように変更しました。 -また、空間計算量がO(1)になる解法も追加しました。 -*/ -func convert_step3(s string, numRows int) string { - if numRows == 1 { - return s - } - - rows := make([]strings.Builder, numRows) - cycleLen := 2*numRows - 2 - for i, r := range s { - rowNum := i % cycleLen - if rowNum >= numRows { - rowNum = cycleLen - rowNum - } - rows[rowNum].WriteRune(r) - } - - var oneline strings.Builder - for _, row := range rows { - oneline.WriteString(row.String()) - } - return oneline.String() -} - -func convert_step3_anothersolution(s string, numRows int) string { - if numRows == 1 { - return s - } - var oneline strings.Builder - cycleLen := 2*numRows - 2 - for rowNum := 0; rowNum < numRows; rowNum++ { - for i := rowNum; i < len(s); i += cycleLen { - oneline.WriteByte(s[i]) - if 0 < rowNum && rowNum < numRows-1 { - diagIdx := i + cycleLen - rowNum*2 - if diagIdx < len(s) { - oneline.WriteByte(s[diagIdx]) - } - } - } - } - return oneline.String() -} diff --git a/pullrequests/zigzag_conversion/step4.go b/pullrequests/zigzag_conversion/step4.go deleted file mode 100644 index eeaa1f6..0000000 --- a/pullrequests/zigzag_conversion/step4.go +++ /dev/null @@ -1,47 +0,0 @@ -//lint:file-ignore U1000 Ignore all unused code -package zigzagconversion - -import "strings" - -func convert(s string, numRows int) string { - if numRows == 1 { - return s - } - - rows := make([]strings.Builder, numRows) - cycleLength := 2*numRows - 2 - for i, r := range s { - rowIndex := i % cycleLength - if rowIndex >= numRows { - rowIndex = cycleLength - rowIndex - } - rows[rowIndex].WriteRune(r) - } - - var oneline strings.Builder - for _, row := range rows { - oneline.WriteString(row.String()) - } - return oneline.String() -} - -func convert_anothersolution(s string, numRows int) string { - if numRows == 1 { - return s - } - var oneline strings.Builder - cycleLength := 2*numRows - 2 - for rowIndex := 0; rowIndex < numRows; rowIndex++ { - for i := rowIndex; i < len(s); i += cycleLength { - oneline.WriteByte(s[i]) - if rowIndex == 0 || rowIndex == numRows-1 { - continue - } - diagIndex := i + cycleLength - rowIndex*2 - if diagIndex < len(s) { - oneline.WriteByte(s[diagIndex]) - } - } - } - return oneline.String() -} From b593729b7515cb053a5195e843d67dbdf0f4f82a Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 2 Nov 2024 22:43:23 +0900 Subject: [PATCH 368/396] refactor Add Binary --- go/add_binary.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/go/add_binary.go b/go/add_binary.go index 959efc0..db2f526 100644 --- a/go/add_binary.go +++ b/go/add_binary.go @@ -8,12 +8,11 @@ import ( func addBinary(a string, b string) string { var reversed strings.Builder - maxLength := max(len(a), len(b)) carry := 0 - for i := 1; i <= maxLength; i++ { + for i := 1; i <= len(a) || i <= len(b); i++ { bitA, bitB := 0, 0 if i <= len(a) { - bitA = int(a[len(a)-i] - '0') // a[len(a)-i]がbyte型なので'0'もbyte型と解釈される + bitA = int(a[len(a)-i] - '0') // a[len(a)-i]がbyte型なので'0'もbyte型と解釈さ } if i <= len(b) { bitB = int(b[len(b)-i] - '0') From 18f277805f0a905b52e648e2e576ccda618f1cfc Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 2 Nov 2024 23:00:08 +0900 Subject: [PATCH 369/396] refactor Add Binary --- go/add_binary.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/add_binary.go b/go/add_binary.go index db2f526..76139da 100644 --- a/go/add_binary.go +++ b/go/add_binary.go @@ -22,7 +22,7 @@ func addBinary(a string, b string) string { reversed.WriteByte(byte(sum%2 + '0')) // sum%2がint型なので'0'もint型として扱われる } if carry == 1 { - reversed.WriteByte(byte(carry + '0')) + reversed.WriteByte('1') } result := []rune(reversed.String()) slices.Reverse(result) From 2f0fc67c91d86214b99dd4e3d6ce01171617b3b4 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 2 Nov 2024 23:08:05 +0900 Subject: [PATCH 370/396] refactor Add Binary --- go/add_binary.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/go/add_binary.go b/go/add_binary.go index 76139da..9ae2bbd 100644 --- a/go/add_binary.go +++ b/go/add_binary.go @@ -3,6 +3,7 @@ package main import ( "slices" + "strconv" "strings" ) @@ -12,14 +13,14 @@ func addBinary(a string, b string) string { for i := 1; i <= len(a) || i <= len(b); i++ { bitA, bitB := 0, 0 if i <= len(a) { - bitA = int(a[len(a)-i] - '0') // a[len(a)-i]がbyte型なので'0'もbyte型と解釈さ + bitA, _ = strconv.Atoi(string(a[len(a)-i])) } if i <= len(b) { - bitB = int(b[len(b)-i] - '0') + bitB, _ = strconv.Atoi(string(b[len(b)-i])) } sum := bitA + bitB + carry carry = sum / 2 - reversed.WriteByte(byte(sum%2 + '0')) // sum%2がint型なので'0'もint型として扱われる + reversed.WriteString(strconv.Itoa(sum % 2)) } if carry == 1 { reversed.WriteByte('1') From c3b4dbbda5ecc47198de0ecb0f5de0a1d4682d63 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 2 Nov 2024 23:32:24 +0900 Subject: [PATCH 371/396] refactor Middle of the Linked List --- go/middle_of_the_linked_list.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/go/middle_of_the_linked_list.go b/go/middle_of_the_linked_list.go index 3ec2eb4..9dc7ade 100644 --- a/go/middle_of_the_linked_list.go +++ b/go/middle_of_the_linked_list.go @@ -2,17 +2,17 @@ package main func middleNode(head *ListNode) *ListNode { - count := 0 + length := 0 node := head for node != nil { + length++ node = node.Next - count++ } - middle := head - for i := 0; i < count/2; i++ { - middle = middle.Next + node = head + for i := 0; i < length/2; i++ { + node = node.Next } - return middle + return node } func middleNode2(head *ListNode) *ListNode { From 51b8d21c5d8a3c9a5484a9507a8932de054fb8ee Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 4 Nov 2024 11:28:08 +0900 Subject: [PATCH 372/396] refactor Maximum Depth of Binary Tree --- go/maximum_depth_of_binary_tree.go | 81 +++++++++++------------------- 1 file changed, 29 insertions(+), 52 deletions(-) diff --git a/go/maximum_depth_of_binary_tree.go b/go/maximum_depth_of_binary_tree.go index 508d913..999afb8 100644 --- a/go/maximum_depth_of_binary_tree.go +++ b/go/maximum_depth_of_binary_tree.go @@ -1,6 +1,11 @@ //lint:file-ignore U1000 Ignore all unused code package main +type entry struct { + node *TreeNode + depth int +} + /* 再帰 */ @@ -22,7 +27,7 @@ func maxDepthRecursive(root *TreeNode) int { DFS */ // pushする前にnilノードを弾く -func maxDepthIterativeDFS(root *TreeNode) int { +func maxDepthIterativePreOrder1(root *TreeNode) int { if root == nil { return 0 } @@ -32,18 +37,18 @@ func maxDepthIterativeDFS(root *TreeNode) int { e := stack[len(stack)-1] stack = stack[:len(stack)-1] maximum = max(maximum, e.depth) - if e.node.Left != nil { - stack = append(stack, entry{e.node.Left, e.depth + 1}) - } if e.node.Right != nil { stack = append(stack, entry{e.node.Right, e.depth + 1}) } + if e.node.Left != nil { + stack = append(stack, entry{e.node.Left, e.depth + 1}) + } } return maximum } // popした後にnilノードを弾く -func maxDepthIterativeDFS2(root *TreeNode) int { +func maxDepthIterativePreOrder2(root *TreeNode) int { maximum := 0 stack := []entry{{root, 1}} for len(stack) > 0 { @@ -53,62 +58,39 @@ func maxDepthIterativeDFS2(root *TreeNode) int { continue } maximum = max(maximum, e.depth) - stack = append(stack, entry{e.node.Left, e.depth + 1}) stack = append(stack, entry{e.node.Right, e.depth + 1}) + stack = append(stack, entry{e.node.Left, e.depth + 1}) } return maximum } -// 帰りがけにdepthを更新 -func maxDepthIterativeDFS3(root *TreeNode) int { - maximum := 0 - stack := []*entry2{ - { - node: root, - isPreorder: true, - depth: &maximum, - leftDepth: new(int), - rightDepth: new(int), - }, +func maxDepthIterativePostOrder(root *TreeNode) int { + if root == nil { + return 0 } + maximum := 0 + stack := []entry{{root, 1}} + var lastVisited *TreeNode for len(stack) > 0 { e := stack[len(stack)-1] - stack = stack[:len(stack)-1] - if e.isPreorder { - if e.node == nil { - continue - } - e.isPreorder = false - stack = append(stack, e) - stack = append(stack, &entry2{ - node: e.node.Left, - isPreorder: true, - depth: e.leftDepth, - leftDepth: new(int), - rightDepth: new(int), - }) - stack = append(stack, &entry2{ - node: e.node.Right, - isPreorder: true, - depth: e.rightDepth, - leftDepth: new(int), - rightDepth: new(int), - }) + node := e.node + depth := e.depth + if node == nil { + stack = stack[:len(stack)-1] + continue + } + if (node.Left == nil && node.Right == nil) || (lastVisited != nil && (lastVisited == node.Left || lastVisited == node.Right)) { + stack = stack[:len(stack)-1] + maximum = max(maximum, depth) + lastVisited = node } else { - *e.depth = max(*e.leftDepth, *e.rightDepth) + 1 + stack = append(stack, entry{node.Right, depth + 1}) + stack = append(stack, entry{node.Left, depth + 1}) } } return maximum } -type entry2 struct { - node *TreeNode - isPreorder bool - depth *int - leftDepth *int - rightDepth *int -} - /* BFS */ @@ -150,11 +132,6 @@ func maxDepthIterativeBFS2(root *TreeNode) int { return maximum } -type entry struct { - node *TreeNode - depth int -} - // depthを保持せずに処理する func maxDepthIterativeBFS3(root *TreeNode) int { if root == nil { From 4892de660d7c15e2b0f2686b6d9177581b64b528 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 4 Nov 2024 11:28:28 +0900 Subject: [PATCH 373/396] basics/tree --- basics/main.go | 72 ++++++++++++++++++++++++++++++- basics/tree/orders.go | 99 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 170 insertions(+), 1 deletion(-) create mode 100644 basics/tree/orders.go diff --git a/basics/main.go b/basics/main.go index 8971abc..c7cf528 100644 --- a/basics/main.go +++ b/basics/main.go @@ -9,12 +9,14 @@ import ( "github.com/rihib/leetcode/basics/graph" "github.com/rihib/leetcode/basics/queue" "github.com/rihib/leetcode/basics/sort" + "github.com/rihib/leetcode/basics/tree" ) func main() { testSort() testPriorityQueue() testDijkstra() + testTree() } func testSort() { @@ -112,7 +114,7 @@ func testPriorityQueue() { node, l, isEmpty = pq.Peek(), pq.Len(), pq.IsEmpty() fmt.Printf("Peek returns nil: %t, Len: %d, IsEmpty: %t\n", node == nil, l, isEmpty) - fmt.Println("") + fmt.Print("\n") } func testDijkstra() { @@ -129,4 +131,72 @@ func testDijkstra() { for node, distance := range dist { fmt.Printf("Distance from node 0 to node %d is %d\n", node, distance) } + + fmt.Print("\n") +} + +func testTree() { + /* + 下記のツリーが構築される。 + 1 + / \ + 2 3 + / \ / \ + x 4 5 x + / \ / + x x 6 + */ + nums := []int{1, 2, 3, -1, 4, 5, -1, -1, -1, 6} + root := buildTree(nums) + fmt.Println("=====Tree=====") + + fmt.Print("Pre-order: ") + tree.PreOrderTraversal(root) // 1, 2, 4, 3, 5, 6 + fmt.Print("\n") + + fmt.Print("In-order: ") + tree.InOrderTraversal(root) // 2, 4, 1, 6, 5, 3 + fmt.Print("\n") + + fmt.Print("Post-order: ") + tree.PostOrderTraversal(root) // 4, 2, 6, 5, 3, 1 + fmt.Print("\n") + + fmt.Print("Pre-order Iterative: ") + tree.PreOrderTraversalIterative(root) // 1, 2, 4, 3, 5, 6 + fmt.Print("\n") + + fmt.Print("In-order Iterative: ") + tree.InOrderTraversalIterative(root) // 2, 4, 1, 6, 5, 3 + fmt.Print("\n") + + fmt.Print("Post-order Iterative: ") + tree.PostOrderTraversalIterative(root) // 4, 2, 6, 5, 3, 1 + fmt.Print("\n") + + fmt.Print("\n") +} + +func buildTree(nums []int) *tree.Node { + if len(nums) == 0 || nums[0] < 0 { + return nil + } + root := &tree.Node{Val: nums[0]} + queue := []*tree.Node{root} + index := 1 + for len(queue) > 0 && index < len(nums) { + node := queue[0] + queue = queue[1:] + if nums[index] >= 0 { + node.Left = &tree.Node{Val: nums[index]} + queue = append(queue, node.Left) + } + index++ + if index < len(nums) && nums[index] >= 0 { + node.Right = &tree.Node{Val: nums[index]} + queue = append(queue, node.Right) + } + index++ + } + return root } diff --git a/basics/tree/orders.go b/basics/tree/orders.go new file mode 100644 index 0000000..75b538c --- /dev/null +++ b/basics/tree/orders.go @@ -0,0 +1,99 @@ +package tree + +import "fmt" + +type Node struct { + Val int + Left *Node + Right *Node +} + +// Root -> Left -> Right +func PreOrderTraversal(root *Node) { + if root == nil { + return + } + fmt.Printf("%d ", root.Val) + PreOrderTraversal(root.Left) + PreOrderTraversal(root.Right) +} + +// Left -> Root -> Right +func InOrderTraversal(root *Node) { + if root == nil { + return + } + InOrderTraversal(root.Left) + fmt.Printf("%d ", root.Val) + InOrderTraversal(root.Right) +} + +// Left -> Right -> Root +func PostOrderTraversal(root *Node) { + if root == nil { + return + } + PostOrderTraversal(root.Left) + PostOrderTraversal(root.Right) + fmt.Printf("%d ", root.Val) +} + +func PreOrderTraversalIterative(root *Node) { + if root == nil { + return + } + stack := []*Node{root} + for len(stack) > 0 { + node := stack[len(stack)-1] + stack = stack[:len(stack)-1] + fmt.Printf("%d ", node.Val) + // 厳密にpre-orderにするなら、まず右の子ノードを追加してから左の子ノードを追加する + if node.Right != nil { + stack = append(stack, node.Right) + } + if node.Left != nil { + stack = append(stack, node.Left) + } + } +} + +func InOrderTraversalIterative(root *Node) { + stack := []*Node{} + node := root + for len(stack) > 0 || node != nil { + for node != nil { + stack = append(stack, node) + node = node.Left + } + node = stack[len(stack)-1] + stack = stack[:len(stack)-1] + fmt.Printf("%d ", node.Val) + node = node.Right + } +} + +func PostOrderTraversalIterative(root *Node) { + if root == nil { + return + } + stack := []*Node{root} + var lastVisited *Node + for len(stack) > 0 { + node := stack[len(stack)-1] + if node == nil { + stack = stack[:len(stack)-1] + continue + } + // 左右の子が処理済み、または子がない場合にノードを取り出す + if (node.Left == nil && node.Right == nil) || + (lastVisited != nil && + (lastVisited == node.Left || lastVisited == node.Right)) { + stack = stack[:len(stack)-1] + fmt.Printf("%d ", node.Val) + lastVisited = node + } else { + stack = append(stack, node.Right) + stack = append(stack, node.Left) + } + } +} From ae8b5d1e6e6712ca3a7d563faaa4bd724536150d Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 4 Nov 2024 11:42:49 +0900 Subject: [PATCH 374/396] refactor basics/tree --- basics/main.go | 12 +++++++++-- basics/tree/orders.go | 50 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 59 insertions(+), 3 deletions(-) diff --git a/basics/main.go b/basics/main.go index c7cf528..d654573 100644 --- a/basics/main.go +++ b/basics/main.go @@ -170,8 +170,16 @@ func testTree() { tree.InOrderTraversalIterative(root) // 2, 4, 1, 6, 5, 3 fmt.Print("\n") - fmt.Print("Post-order Iterative: ") - tree.PostOrderTraversalIterative(root) // 4, 2, 6, 5, 3, 1 + fmt.Print("Post-order Iterative1: ") + tree.PostOrderTraversalIterative1(root) // 4, 2, 6, 5, 3, 1 + fmt.Print("\n") + + fmt.Print("Post-order Iterative2: ") + tree.PostOrderTraversalIterative2(root) // 4, 2, 6, 5, 3, 1 + fmt.Print("\n") + + fmt.Print("Post-order Iterative3: ") + tree.PostOrderTraversalIterative3(root) // 4, 2, 6, 5, 3, 1 fmt.Print("\n") fmt.Print("\n") diff --git a/basics/tree/orders.go b/basics/tree/orders.go index 75b538c..40df100 100644 --- a/basics/tree/orders.go +++ b/basics/tree/orders.go @@ -72,7 +72,7 @@ func InOrderTraversalIterative(root *Node) { } } -func PostOrderTraversalIterative(root *Node) { +func PostOrderTraversalIterative1(root *Node) { if root == nil { return } @@ -97,3 +97,51 @@ func PostOrderTraversalIterative(root *Node) { } } } + +func PostOrderTraversalIterative2(root *Node) { + if root == nil { + return + } + stack := []*Node{} + var lastVisited *Node + node := root + for len(stack) > 0 || node != nil { + if node != nil { + stack = append(stack, node) + node = node.Left + continue + } + peekNode := stack[len(stack)-1] + if peekNode.Right != nil && lastVisited != peekNode.Right { + node = peekNode.Right + } else { + fmt.Printf("%d ", peekNode.Val) + lastVisited = stack[len(stack)-1] + stack = stack[:len(stack)-1] + } + } +} + +func PostOrderTraversalIterative3(root *Node) { + if root == nil { + return + } + stack1 := []*Node{root} + stack2 := []*Node{} + for len(stack1) > 0 { + node := stack1[len(stack1)-1] + stack1 = stack1[:len(stack1)-1] + stack2 = append(stack2, node) + if node.Left != nil { + stack1 = append(stack1, node.Left) + } + if node.Right != nil { + stack1 = append(stack1, node.Right) + } + } + for len(stack2) > 0 { + node := stack2[len(stack2)-1] + stack2 = stack2[:len(stack2)-1] + fmt.Printf("%d ", node.Val) + } +} From 9d4cb05b3c02a54fbc911333a7c83dae06db7090 Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 14 Nov 2024 22:59:57 +0900 Subject: [PATCH 375/396] refactor Roman to Integer --- go/roman_to_integer.go | 31 ------------------------------- 1 file changed, 31 deletions(-) diff --git a/go/roman_to_integer.go b/go/roman_to_integer.go index 9cb10d0..43ac89c 100644 --- a/go/roman_to_integer.go +++ b/go/roman_to_integer.go @@ -2,37 +2,6 @@ package main func romanToInt(s string) int { - symbolToInt := map[rune]int{ - 'I': 1, - 'V': 5, - 'X': 10, - 'L': 50, - 'C': 100, - 'D': 500, - 'M': 1000, - } - total := 0 - runeS := []rune(s) - currIndex, nextIndex := 0, 1 - for currIndex < len(runeS) && nextIndex < len(runeS) { - curr, next := runeS[currIndex], runeS[nextIndex] - if (curr == 'I' && (next == 'V' || next == 'X')) || - (curr == 'X' && (next == 'L' || next == 'C')) || - (curr == 'C' && (next == 'D' || next == 'M')) { - total += symbolToInt[next] - symbolToInt[curr] - currIndex, nextIndex = currIndex+2, nextIndex+2 - continue - } - total += symbolToInt[curr] - currIndex, nextIndex = currIndex+1, nextIndex+1 - } - if currIndex < len(runeS) { - total += symbolToInt[runeS[currIndex]] - } - return total -} - -func romanToInt2(s string) int { symbolToInt := map[rune]int{ 'I': 1, 'V': 5, From c62e40b479cf9ea1e0b754f3bcc874e2af7fd6e5 Mon Sep 17 00:00:00 2001 From: rihib Date: Thu, 14 Nov 2024 23:47:35 +0900 Subject: [PATCH 376/396] refactor Two Sum --- go/two_sum.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/two_sum.go b/go/two_sum.go index 039cfb8..e884864 100644 --- a/go/two_sum.go +++ b/go/two_sum.go @@ -2,7 +2,7 @@ package main func twoSum(nums []int, target int) []int { - numToIndex := make(map[int]int) + numToIndex := make(map[int]int, len(nums)) for i, n := range nums { if j, ok := numToIndex[target-n]; ok { return []int{i, j} From 37ea881ad5bad9b2c3b58160cb420d89cb1503c5 Mon Sep 17 00:00:00 2001 From: rihib Date: Fri, 15 Nov 2024 00:12:50 +0900 Subject: [PATCH 377/396] reafctor Group Anagrams --- go/group_anagrams.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/group_anagrams.go b/go/group_anagrams.go index 6ffaf84..1529036 100644 --- a/go/group_anagrams.go +++ b/go/group_anagrams.go @@ -2,7 +2,7 @@ package main func groupAnagrams(strs []string) [][]string { - anagramsMap := make(map[[26]int][]string) + anagramsMap := make(map[[26]int][]string, len(strs)) for _, word := range strs { var frequencies [26]int for _, r := range word { From c95cbf652ed6c7e7f4aad4cafcd9c01ab20ccaca Mon Sep 17 00:00:00 2001 From: rihib Date: Fri, 15 Nov 2024 00:15:41 +0900 Subject: [PATCH 378/396] refactor Group Anagrams --- go/group_anagrams.go | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/go/group_anagrams.go b/go/group_anagrams.go index 1529036..cccea09 100644 --- a/go/group_anagrams.go +++ b/go/group_anagrams.go @@ -10,12 +10,9 @@ func groupAnagrams(strs []string) [][]string { } anagramsMap[frequencies] = append(anagramsMap[frequencies], word) } - - anagrams := make([][]string, len(anagramsMap)) - i := 0 - for _, words := range anagramsMap { - anagrams[i] = words - i++ + anagrams := make([][]string, 0, len(anagramsMap)) + for _, group := range anagramsMap { + anagrams = append(anagrams, group) } return anagrams } From 66f2295f7a551dac5f41df44d2e54a68c56d7f23 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 16 Nov 2024 17:41:49 +0900 Subject: [PATCH 379/396] refactor Valid Parentheses --- go/valid_parentheses.go | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/go/valid_parentheses.go b/go/valid_parentheses.go index 7231e5e..27f215b 100644 --- a/go/valid_parentheses.go +++ b/go/valid_parentheses.go @@ -2,15 +2,19 @@ package main func isValid(s string) bool { + closeToOpen := map[rune]rune{ + ')': '(', + '}': '{', + ']': '[', + } var stack []rune - closeToOpens := map[rune]rune{')': '(', '}': '{', ']': '['} - for _, bracket := range s { - openBracket, ok := closeToOpens[bracket] + for _, r := range s { + p, ok := closeToOpen[r] if !ok { - stack = append(stack, bracket) + stack = append(stack, r) continue } - if len(stack) == 0 || stack[len(stack)-1] != openBracket { + if len(stack) == 0 || stack[len(stack)-1] != p { return false } stack = stack[:len(stack)-1] From 3c095384d618537b902c80396f6c52e2b1f8bf14 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 16 Nov 2024 18:12:22 +0900 Subject: [PATCH 380/396] refactor Valid Palindrome --- go/valid_palindrome.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/go/valid_palindrome.go b/go/valid_palindrome.go index 22a0315..d939c16 100644 --- a/go/valid_palindrome.go +++ b/go/valid_palindrome.go @@ -5,21 +5,21 @@ import "unicode" func isPalindrome(s string) bool { runeS := []rune(s) - left, right := 0, len(s)-1 - for left < right { - if !(unicode.IsDigit(runeS[left]) || unicode.IsLetter(runeS[left])) { - left++ + i, j := 0, len(s)-1 + for i < j { + if !unicode.IsDigit(runeS[i]) && !unicode.IsLetter(runeS[i]) { + i++ continue } - if !(unicode.IsDigit(runeS[right]) || unicode.IsLetter(runeS[right])) { - right-- + if !unicode.IsDigit(runeS[j]) && !unicode.IsLetter(runeS[j]) { + j-- continue } - if unicode.ToLower(runeS[left]) != unicode.ToLower(runeS[right]) { + if unicode.ToLower(runeS[i]) != unicode.ToLower(runeS[j]) { return false } - left++ - right-- + i++ + j-- } return true } From 118e62e829653bfd8763b622aefe1f0c023e682d Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 16 Nov 2024 19:42:29 +0900 Subject: [PATCH 381/396] refactor Valid Palindrome --- go/valid_palindrome.go | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/go/valid_palindrome.go b/go/valid_palindrome.go index d939c16..581e878 100644 --- a/go/valid_palindrome.go +++ b/go/valid_palindrome.go @@ -23,3 +23,33 @@ func isPalindrome(s string) bool { } return true } + +func isPalindrome2(s string) bool { + left := make(chan rune) + right := make(chan rune) + go filter(s, left, false) + go filter(s, right, true) + for { + l, lok := <-left + r, rok := <-right + if !lok || !rok { + return true + } + if l != r { + return false + } + } +} + +func filter(s string, c chan rune, reversed bool) { + for i := range s { + if reversed { + i = len(s) - 1 - i + } + r := rune(s[i]) + if unicode.IsDigit(r) || unicode.IsLetter(r) { + c <- unicode.ToLower(r) + } + } + close(c) +} From cdcc32cff54b77df1a7c2463cdd1c20f065908b8 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 16 Nov 2024 21:27:18 +0900 Subject: [PATCH 382/396] refactor Number of 1 Bits --- go/number_of_1bits.go | 24 +++--------------------- 1 file changed, 3 insertions(+), 21 deletions(-) diff --git a/go/number_of_1bits.go b/go/number_of_1bits.go index 94bc4e2..55f364a 100644 --- a/go/number_of_1bits.go +++ b/go/number_of_1bits.go @@ -1,29 +1,11 @@ //lint:file-ignore U1000 Ignore all unused code package main -func hammingWeightNaive1(n int) int { - count := 0 - for n > 0 { - count += n % 2 - n /= 2 - } - return count -} - -func hammingWeightNaive2(n int) int { - count := 0 - for n != 0 { - count += n & 1 - n >>= 1 - } - return count -} - func hammingWeightBitmanipulation(n int) int { count := 0 for n > 0 { n &= n - 1 - count += 1 + count++ } return count } @@ -31,8 +13,8 @@ func hammingWeightBitmanipulation(n int) int { func hammingWeight2Complement(n int) int { count := 0 for n > 0 { - n -= (n & -n) - count += 1 + n -= n & -n + count++ } return count } From d79834a837ba65843542d4717858127f106c4329 Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 16 Nov 2024 21:39:17 +0900 Subject: [PATCH 383/396] refactor Counting Bits --- go/counting_bits.go | 27 +++++---------------------- 1 file changed, 5 insertions(+), 22 deletions(-) diff --git a/go/counting_bits.go b/go/counting_bits.go index e9e2c4d..ebc8a21 100644 --- a/go/counting_bits.go +++ b/go/counting_bits.go @@ -1,32 +1,15 @@ //lint:file-ignore U1000 Ignore all unused code package main -// 2の冪乗の時はMSBのみが1になる -// それ以外の場合はMSB以外の部分はすでに前に計算していてメモ化されているのでそれを使えばいい func countBits(n int) []int { - bitCounts := make([]int, n+1) - powerOfTwo := 1 - for i := 1; i <= n; i++ { - if i == powerOfTwo*2 { - powerOfTwo = i - } - bitCounts[i] = 1 + bitCounts[i-powerOfTwo] - } - return bitCounts -} - -// 内側のループはnを2で割り続けるのでlog n回 -// 外側のループはn回なので、全体でO(n log n)になる -func countBits2(n int) []int { bitCounts := make([]int, n+1) for i := 0; i <= n; i++ { - num := i - count := 0 - for num > 0 { - count += num % 2 - num /= 2 + if i == 0 || i == 1 { + bitCounts[i] = i + continue } - bitCounts[i] = count + j := i & (i - 1) + bitCounts[i] = bitCounts[j] + 1 } return bitCounts } From 0983bff8be31b6d4fe9d99a21d1f1a5658a3e253 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 17 Nov 2024 13:27:40 +0900 Subject: [PATCH 384/396] Climbing Stairs --- go/climbing_stairs.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/go/climbing_stairs.go b/go/climbing_stairs.go index 292312d..298af33 100644 --- a/go/climbing_stairs.go +++ b/go/climbing_stairs.go @@ -2,8 +2,8 @@ package main func climbStairsDP(n int) int { - prev, curr := 0, 1 - for i := 1; i <= n; i++ { + prev, curr := 1, 1 + for i := 1; i < n; i++ { prev, curr = curr, prev+curr } return curr @@ -15,8 +15,8 @@ func climbStairsmemorizedRecursion(n int) int { } func climbStairsHelper(n int, m map[int]int) int { - if n == 1 || n == 2 { - return n + if n == 0 || n == 1 { + return 1 } if ways, ok := m[n]; ok { return ways From a25c337a11a004ad03dd66729b09e6aec5885051 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 17 Nov 2024 16:34:33 +0900 Subject: [PATCH 385/396] refactor Counting Bits --- go/counting_bits.go | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/go/counting_bits.go b/go/counting_bits.go index ebc8a21..3f642d3 100644 --- a/go/counting_bits.go +++ b/go/counting_bits.go @@ -3,13 +3,8 @@ package main func countBits(n int) []int { bitCounts := make([]int, n+1) - for i := 0; i <= n; i++ { - if i == 0 || i == 1 { - bitCounts[i] = i - continue - } - j := i & (i - 1) - bitCounts[i] = bitCounts[j] + 1 + for i := 1; i <= n; i++ { + bitCounts[i] = 1 + bitCounts[i&(i-1)] // i&(i-1) unset rightmost set bit } return bitCounts } From 65625f34a9c71a2f360cf693e7fabf10e918ba95 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 18 Nov 2024 00:18:16 +0900 Subject: [PATCH 386/396] add another solution for Longest Common Prefix --- go/longest_common_prefix.go | 50 +++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/go/longest_common_prefix.go b/go/longest_common_prefix.go index ed2725a..4d0c68d 100644 --- a/go/longest_common_prefix.go +++ b/go/longest_common_prefix.go @@ -36,3 +36,53 @@ func longestCommonPrefix2(strs []string) string { } return strs[0] } + +/* +Trie +*/ +type Trie struct { + root *Node +} + +type Node struct { + children map[rune]*Node + isWordEnd bool +} + +func NewTrie() *Trie { + return &Trie{root: &Node{children: make(map[rune]*Node)}} +} + +func (t *Trie) Insert(word string) { + node := t.root + for _, r := range word { + if _, ok := node.children[r]; !ok { + node.children[r] = &Node{children: make(map[rune]*Node)} + } + node = node.children[r] + } + node.isWordEnd = true +} + +func (t *Trie) Prefix() string { + node := t.root + var prefix []rune + for len(node.children) == 1 && !node.isWordEnd { + for r, child := range node.children { + prefix = append(prefix, r) + node = child // ここでnodeをchildで更新してもrangeは評価済みなのでループが続くことはない + } + } + return string(prefix) +} + +func longestCommonPrefix(strs []string) string { + if len(strs) == 0 { + return "" + } + trie := NewTrie() + for _, word := range strs { + trie.Insert(word) + } + return trie.Prefix() +} From 4b75ea3bc1ece1494e8d4303b6fc1abe40b1c53c Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 18 Nov 2024 23:17:17 +0900 Subject: [PATCH 387/396] refactor Longest Common Prefix --- go/longest_common_prefix.go | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/go/longest_common_prefix.go b/go/longest_common_prefix.go index 4d0c68d..d05834e 100644 --- a/go/longest_common_prefix.go +++ b/go/longest_common_prefix.go @@ -3,6 +3,7 @@ package main import ( "sort" + "strings" ) func longestCommonPrefix1(strs []string) string { @@ -65,24 +66,21 @@ func (t *Trie) Insert(word string) { } func (t *Trie) Prefix() string { + var prefix strings.Builder node := t.root - var prefix []rune for len(node.children) == 1 && !node.isWordEnd { for r, child := range node.children { - prefix = append(prefix, r) + prefix.WriteRune(r) node = child // ここでnodeをchildで更新してもrangeは評価済みなのでループが続くことはない } } - return string(prefix) + return prefix.String() } func longestCommonPrefix(strs []string) string { - if len(strs) == 0 { - return "" - } - trie := NewTrie() + t := NewTrie() for _, word := range strs { - trie.Insert(word) + t.Insert(word) } - return trie.Prefix() + return t.Prefix() } From d7ce094397c29d541340e3640077292eccb9fe28 Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 18 Nov 2024 23:33:09 +0900 Subject: [PATCH 388/396] refactor Longest Common Prefix --- go/longest_common_prefix.go | 45 +++++++++++++------------------------ 1 file changed, 16 insertions(+), 29 deletions(-) diff --git a/go/longest_common_prefix.go b/go/longest_common_prefix.go index d05834e..c87dd75 100644 --- a/go/longest_common_prefix.go +++ b/go/longest_common_prefix.go @@ -2,40 +2,27 @@ package main import ( - "sort" "strings" ) -func longestCommonPrefix1(strs []string) string { - if len(strs) == 0 { - return "" - } - minLength := len(strs[0]) - for _, s := range strs { - minLength = min(minLength, len(s)) - } - for i := 0; i < minLength; i++ { - c := strs[0][i] - for _, word := range strs[1:] { - if word[i] != c { - return strs[0][:i] +func longestCommonPrefix(strs []string) string { + var prefix strings.Builder + for i := 0; ; i++ { + var curr rune + for _, word := range strs { + if i >= len(word) { + return prefix.String() + } + if curr == 0 { + curr = rune(word[i]) + continue + } + if rune(word[i]) != curr { + return prefix.String() } } + prefix.WriteRune(curr) } - return strs[0][:minLength] -} - -func longestCommonPrefix2(strs []string) string { - if len(strs) == 0 { - return "" - } - sort.Strings(strs) - for i := range strs[0] { - if strs[0][i] != strs[len(strs)-1][i] { - return strs[0][:i] - } - } - return strs[0] } /* @@ -77,7 +64,7 @@ func (t *Trie) Prefix() string { return prefix.String() } -func longestCommonPrefix(strs []string) string { +func longestCommonPrefixTrie(strs []string) string { t := NewTrie() for _, word := range strs { t.Insert(word) From e544ffd01307cef818aa2737f2e1fad18904c81f Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 3 Dec 2024 13:18:31 +0900 Subject: [PATCH 389/396] refactor Top K Frequent Elements --- go/top_k_frequent_elements.go | 95 +++++++++++++---------------------- 1 file changed, 34 insertions(+), 61 deletions(-) diff --git a/go/top_k_frequent_elements.go b/go/top_k_frequent_elements.go index 47369ca..6ae14b5 100644 --- a/go/top_k_frequent_elements.go +++ b/go/top_k_frequent_elements.go @@ -7,19 +7,14 @@ import ( "sort" ) -type Element struct { - num int - count int -} - func topKFrequentBucketSort(nums []int, k int) []int { - frequency := make(map[int]int) - for _, num := range nums { - frequency[num]++ + frequencies := make(map[int]int, len(nums)) + for _, n := range nums { + frequencies[n]++ } countToNum := make([][]int, len(nums)+1) - for num, count := range frequency { - countToNum[count] = append(countToNum[count], num) + for n, count := range frequencies { + countToNum[count] = append(countToNum[count], n) } topK := make([]int, 0, k) for i := len(countToNum) - 1; i >= 0 && len(topK) < k; i-- { @@ -28,16 +23,21 @@ func topKFrequentBucketSort(nums []int, k int) []int { return topK } +type element struct { + num int + count int +} + func topKFrequentQuickselect(nums []int, k int) []int { - frequency := make(map[int]int) - for _, num := range nums { - frequency[num]++ + frequencies := make(map[int]int, len(nums)) + for _, n := range nums { + frequencies[n]++ } - elements := make([]Element, 0, len(frequency)) - for num, count := range frequency { - elements = append(elements, Element{num: num, count: count}) + elements := make([]element, 0, len(frequencies)) + for n, count := range frequencies { + elements = append(elements, element{n, count}) } - quickselect(elements, 0, len(elements)-1, len(elements)-k, partitionRandom) + quickselect(elements, 0, len(elements)-1, len(elements)-k) topK := make([]int, k) for i := 0; i < k; i++ { topK[i] = elements[len(elements)-1-i].num @@ -45,55 +45,28 @@ func topKFrequentQuickselect(nums []int, k int) []int { return topK } -func quickselect( - elements []Element, left, right, k int, - partition func([]Element, int, int) int) { +func quickselect(elements []element, left, right, k int) { for left < right { pivotIndex := partition(elements, left, right) - if pivotIndex == k { + if k == pivotIndex { return } - if pivotIndex < k { - left = pivotIndex + 1 - } else { + if k < pivotIndex { right = pivotIndex - 1 + } else { + left = pivotIndex + 1 } } } -func partitionRandom(elements []Element, left, right int) int { +func partition(elements []element, left, right int) int { pivotIndex := left + rand.IntN(right-left+1) + pivotValue := elements[pivotIndex].count elements[pivotIndex], elements[right] = elements[right], elements[pivotIndex] - pivot := elements[right].count - storeIndex := left - for i := left; i < right; i++ { - if elements[i].count < pivot { - elements[i], elements[storeIndex] = elements[storeIndex], elements[i] - storeIndex++ - } - } - elements[storeIndex], elements[right] = elements[right], elements[storeIndex] - return storeIndex -} - -func partitionMedianOf3(elements []Element, left, right int) int { - mid := left + (right-left)/2 - if elements[right].count < elements[left].count { - elements[right], elements[left] = elements[left], elements[right] - } - if elements[mid].count < elements[left].count { - elements[mid], elements[left] = elements[left], elements[mid] - } - if elements[right].count < elements[mid].count { - elements[right], elements[mid] = elements[mid], elements[right] - } - pivotIndex := mid - elements[pivotIndex], elements[right] = elements[right], elements[pivotIndex] - pivot := elements[right].count storeIndex := left for i := left; i < right; i++ { - if elements[i].count < pivot { - elements[i], elements[storeIndex] = elements[storeIndex], elements[i] + if elements[i].count < pivotValue { + elements[storeIndex], elements[i] = elements[i], elements[storeIndex] storeIndex++ } } @@ -124,22 +97,22 @@ func topKFrequentMinHeap(nums []int, k int) []int { h := &MinHeap{} heap.Init(h) for num, count := range frequency { - heap.Push(h, Element{num: num, count: count}) + heap.Push(h, element{num: num, count: count}) if h.Len() > k { heap.Pop(h) } } topK := make([]int, 0, k) for h.Len() > 0 { - topK = append(topK, heap.Pop(h).(Element).num) + topK = append(topK, heap.Pop(h).(element).num) } return topK } -type MinHeap []Element +type MinHeap []element func (h *MinHeap) Push(x interface{}) { - *h = append(*h, x.(Element)) + *h = append(*h, x.(element)) } func (h *MinHeap) Pop() interface{} { @@ -160,19 +133,19 @@ func topKFrequentMaxHeap(nums []int, k int) []int { h := &MaxHeap{} heap.Init(h) for num, count := range frequency { - heap.Push(h, Element{num: num, count: count}) + heap.Push(h, element{num: num, count: count}) } topK := make([]int, 0, k) for i := 0; i < k; i++ { - topK = append(topK, heap.Pop(h).(Element).num) + topK = append(topK, heap.Pop(h).(element).num) } return topK } -type MaxHeap []Element +type MaxHeap []element func (h *MaxHeap) Push(x interface{}) { - *h = append(*h, x.(Element)) + *h = append(*h, x.(element)) } func (h *MaxHeap) Pop() interface{} { From 6e8016132ac4da7e679dad8749c6f53ad2e2e66e Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 3 Dec 2024 14:34:13 +0900 Subject: [PATCH 390/396] refactor Top K Frequent Elements --- go/top_k_frequent_elements.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/go/top_k_frequent_elements.go b/go/top_k_frequent_elements.go index 6ae14b5..93806f2 100644 --- a/go/top_k_frequent_elements.go +++ b/go/top_k_frequent_elements.go @@ -38,9 +38,9 @@ func topKFrequentQuickselect(nums []int, k int) []int { elements = append(elements, element{n, count}) } quickselect(elements, 0, len(elements)-1, len(elements)-k) - topK := make([]int, k) + topK := make([]int, 0, k) for i := 0; i < k; i++ { - topK[i] = elements[len(elements)-1-i].num + topK = append(topK, elements[len(elements)-1-i].num) } return topK } From 92dc86f0f2696865c0699ee83fff7ff98d782bff Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 17 Dec 2024 01:10:44 +0900 Subject: [PATCH 391/396] fix top k frequent elements --- go/top_k_frequent_elements.go | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/go/top_k_frequent_elements.go b/go/top_k_frequent_elements.go index 93806f2..64fa3e6 100644 --- a/go/top_k_frequent_elements.go +++ b/go/top_k_frequent_elements.go @@ -28,6 +28,7 @@ type element struct { count int } +// see https://ja.wikipedia.org/wiki/クイックセレクト func topKFrequentQuickselect(nums []int, k int) []int { frequencies := make(map[int]int, len(nums)) for _, n := range nums { @@ -75,16 +76,17 @@ func partition(elements []element, left, right int) int { } func topKFrequentPDQSort(nums []int, k int) []int { - frequency := make(map[int]int) - for _, num := range nums { - frequency[num]++ + frequencies := make(map[int]int, len(nums)) + for _, n := range nums { + frequencies[n]++ } - numsSet := make([]int, 0, len(frequency)) - for num := range frequency { - numsSet = append(numsSet, num) + numsSet := make([]int, 0, len(frequencies)) + for n := range frequencies { + numsSet = append(numsSet, n) } + // 第2引数の比較関数でtrueになる並び順にnumsSetをソートする sort.Slice(numsSet, func(i, j int) bool { - return frequency[numsSet[i]] > frequency[numsSet[j]] + return frequencies[numsSet[i]] > frequencies[numsSet[j]] }) return numsSet[:k] } From 817e19c23d3ea13dcf94f92f39fd34e7a261de94 Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 17 Dec 2024 01:28:06 +0900 Subject: [PATCH 392/396] refactor Single Number --- go/single_number.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/go/single_number.go b/go/single_number.go index 86b2e65..5365be6 100644 --- a/go/single_number.go +++ b/go/single_number.go @@ -2,9 +2,9 @@ package main func singleNumber(nums []int) int { - res := 0 + singleNum := 0 for _, n := range nums { - res ^= n + singleNum ^= n } - return res + return singleNum } From 46a1bb980fa40771febc8f8608ae4a5a50c43fd1 Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 17 Dec 2024 01:36:22 +0900 Subject: [PATCH 393/396] refactor Single Number --- go/single_number.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/go/single_number.go b/go/single_number.go index 5365be6..f2eeae5 100644 --- a/go/single_number.go +++ b/go/single_number.go @@ -1,6 +1,12 @@ //lint:file-ignore U1000 Ignore all unused code package main +// nums = [2, 3, 2]のとき +// 1回目のループ:0000 XOR 0010 = 0010 +// 2回目のループ:0010 XOR 0011 = 0001 +// 3回目のループ:0001 XOR 0010 = 0011 +// つまり1つだけ1回だけ出現し、他は全て2回出現するという条件が満たされない時は +// XORを使った方法はうまくいかない(例えば[2, 3]など) func singleNumber(nums []int) int { singleNum := 0 for _, n := range nums { From 4a5ed4d030a82399b12c1d75b4d89a2b14626cdd Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 17 Dec 2024 16:16:21 +0900 Subject: [PATCH 394/396] refactor Palindrome Linked List --- go/palindrome_linked_list.go | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/go/palindrome_linked_list.go b/go/palindrome_linked_list.go index ebea2ab..0708ad7 100644 --- a/go/palindrome_linked_list.go +++ b/go/palindrome_linked_list.go @@ -2,27 +2,19 @@ package main func isPalindromeLinkedList(head *ListNode) bool { - slow, fast := head, head - var rev *ListNode - - for fast != nil && fast.Next != nil { - fast = fast.Next.Next - tmp := slow.Next - slow.Next = rev - rev = slow - slow = tmp - } - - if fast != nil { - slow = slow.Next + var values []int + node := head + for node != nil { + values = append(values, node.Val) + node = node.Next } - - for slow != nil { - if slow.Val != rev.Val { + left, right := 0, len(values)-1 + for left < right { + if values[left] != values[right] { return false } - slow, rev = slow.Next, rev.Next + left++ + right-- } - return true } From 31a1921a8ecb022d187173eebe6b94004f2ed8fe Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 17 Dec 2024 16:19:12 +0900 Subject: [PATCH 395/396] pullrequests/palindrome_linked_list --- pullrequests/palindrome_linked_list/step1.go | 33 ++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 pullrequests/palindrome_linked_list/step1.go diff --git a/pullrequests/palindrome_linked_list/step1.go b/pullrequests/palindrome_linked_list/step1.go new file mode 100644 index 0000000..f3a9cf6 --- /dev/null +++ b/pullrequests/palindrome_linked_list/step1.go @@ -0,0 +1,33 @@ +//lint:file-ignore U1000 Ignore all unused code +package palindromelinkedlist + +type ListNode struct { + Val int + Next *ListNode +} + +/* +レビュワーの方へ: + - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 +*/ + +/* +COMMENT +*/ +func isPalindromeLinkedList(head *ListNode) bool { + var values []int + node := head + for node != nil { + values = append(values, node.Val) + node = node.Next + } + left, right := 0, len(values)-1 + for left < right { + if values[left] != values[right] { + return false + } + left++ + right-- + } + return true +} From e261e2241796941a67335b402bda620c26c8a219 Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 17 Dec 2024 16:20:56 +0900 Subject: [PATCH 396/396] fix pullrequests/palindrome_linked_list --- pullrequests/palindrome_linked_list/step1.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pullrequests/palindrome_linked_list/step1.go b/pullrequests/palindrome_linked_list/step1.go index f3a9cf6..2d2e233 100644 --- a/pullrequests/palindrome_linked_list/step1.go +++ b/pullrequests/palindrome_linked_list/step1.go @@ -12,7 +12,8 @@ type ListNode struct { */ /* -COMMENT +時間:5分 +スライスに変換し、Palindromeかどうかを比較するようにした。 */ func isPalindromeLinkedList(head *ListNode) bool { var values []int