diff --git a/Week_01/id_29/Algorithm.png b/Week_01/id_29/Algorithm.png new file mode 100644 index 00000000..bcb626fc Binary files /dev/null and b/Week_01/id_29/Algorithm.png differ diff --git a/Week_01/id_29/LeetCode_021_29.go b/Week_01/id_29/LeetCode_021_29.go new file mode 100644 index 00000000..0a758c06 --- /dev/null +++ b/Week_01/id_29/LeetCode_021_29.go @@ -0,0 +1,39 @@ +package main + +// LeetCode - 021. Merge Two Sorted Lists +// https://leetcode.com/problems/merge-two-sorted-lists/ +func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode { + // Check boundary condition + if l1 == nil { + return l2 + } + if l2 == nil { + return l1 + } + + // Create dummy node + dummy := ListNode{} + head := &dummy + + // Connect l1 and l2 + for l1 != nil && l2 != nil { + if l1.Val < l2.Val { + head.Next = l1 + l1 = l1.Next + } else { + head.Next = l2 + l2 = l2.Next + } + head = head.Next + } + + // Check leftover + if l1 != nil { + head.Next = l1 + } + if l2 != nil { + head.Next = l2 + } + + return dummy.Next +} diff --git a/Week_01/id_29/LeetCode_024_29.go b/Week_01/id_29/LeetCode_024_29.go new file mode 100644 index 00000000..bf0b0897 --- /dev/null +++ b/Week_01/id_29/LeetCode_024_29.go @@ -0,0 +1,24 @@ +package main + +// LeetCode - 024. Swap Nodes in Pairs +// https://leetcode.com/problems/swap-nodes-in-pairs/ +func swapPairs(head *ListNode) *ListNode { + dummy := ListNode{} + dummy.Next = head + + pre := &dummy + + for pre != nil { + if pre.Next == nil || pre.Next.Next == nil { + break + } + + first := pre.Next + pre.Next = first.Next + first.Next = first.Next.Next + pre.Next.Next = first + pre = first + } + + return dummy.Next +} diff --git a/Week_01/id_29/LeetCode_026_29.go b/Week_01/id_29/LeetCode_026_29.go new file mode 100644 index 00000000..576d3641 --- /dev/null +++ b/Week_01/id_29/LeetCode_026_29.go @@ -0,0 +1,16 @@ +package main + +// LeetCode - 026. Remove Duplicates from Sorted Array +// https://leetcode.com/problems/remove-duplicates-from-sorted-array/ +func removeDuplicates(nums []int) int { + replaceIndex := 1 + + for curr := 1; curr < len(nums); curr++ { + if nums[curr] != nums[curr-1] { + nums[replaceIndex] = nums[curr] + replaceIndex++ + } + } + + return replaceIndex +} diff --git a/Week_01/id_29/LeetCode_049_29.go b/Week_01/id_29/LeetCode_049_29.go new file mode 100644 index 00000000..e35df43c --- /dev/null +++ b/Week_01/id_29/LeetCode_049_29.go @@ -0,0 +1,29 @@ +package main + +import ( + "sort" + "strings" +) + +// LeetCode - 49. Group Anagrams +// https://leetcode.com/problems/group-anagrams/ +func SortString(w string) string { + s := strings.Split(w, "") + sort.Strings(s) + return strings.Join(s, "") +} + +func groupAnagrams(strs []string) [][]string { + m := make(map[string][]string) + + for _, w := range strs { + word := SortString(w) + m[word] = append(m[word], w) + } + + var ss [][]string + for e := range m { + ss = append(ss, m[e]) + } + return ss +} diff --git a/Week_01/id_29/LeetCode_050_29.go b/Week_01/id_29/LeetCode_050_29.go new file mode 100644 index 00000000..ab3cf15a --- /dev/null +++ b/Week_01/id_29/LeetCode_050_29.go @@ -0,0 +1,21 @@ +package main + +// LeetCode - 50. Pow(x, n) +// https://leetcode.com/problems/powx-n/ +func myPow(x float64, n int) float64 { + if n == 0 { + return 1 + } + if n == 1 { + return x + } + if n < 0 { + return 1 / myPow(x, -n) + } + + if n%2 == 0 { + return myPow(x*x, n/2) + } else { + return x * myPow(x*x, n/2) + } +} diff --git a/Week_01/id_29/LeetCode_088_29.go b/Week_01/id_29/LeetCode_088_29.go new file mode 100644 index 00000000..a374d13a --- /dev/null +++ b/Week_01/id_29/LeetCode_088_29.go @@ -0,0 +1,20 @@ +package main + +// LeetCode - 088. Merge Sorted Array +// https://leetcode.com/problems/merge-sorted-array/ +func merge(nums1 []int, m int, nums2 []int, n int) { + replaceIndex := m + n - 1 + array1Target := m - 1 + array2Target := n - 1 + + for array2Target >= 0 { + if array1Target >= 0 && nums2[array2Target] < nums1[array1Target] { + nums1[replaceIndex] = nums1[array1Target] + array1Target-- + } else { + nums1[replaceIndex] = nums2[array2Target] + array2Target-- + } + replaceIndex-- + } +} diff --git a/Week_01/id_29/LeetCode_104_29.go b/Week_01/id_29/LeetCode_104_29.go new file mode 100644 index 00000000..a6b2521a --- /dev/null +++ b/Week_01/id_29/LeetCode_104_29.go @@ -0,0 +1,13 @@ +package main + +// LeetCode - 104. Maximum Depth of Binary Tree +// https://leetcode.com/problems/maximum-depth-of-binary-tree/ +import "math" + +func maxDepth(root *TreeNode) int { + if root == nil { + return 0 + } + + return int(math.Max(float64(maxDepth(root.Left)), float64(maxDepth(root.Right))) + 1) +} diff --git a/Week_01/id_29/LeetCode_189_29.go b/Week_01/id_29/LeetCode_189_29.go new file mode 100644 index 00000000..c53ed5bf --- /dev/null +++ b/Week_01/id_29/LeetCode_189_29.go @@ -0,0 +1,21 @@ +package main + +// LeetCode - 189. Rotate Array +// https://leetcode.com/problems/rotate-array/ +func rotate(nums []int, k int) { + n := len(nums) + + k = k % n + + reverse(nums, 0, n-1) + reverse(nums, 0, k-1) + reverse(nums, k, n-1) +} + +func reverse(nums []int, i int, j int) { + for i < j { + nums[i], nums[j] = nums[j], nums[i] + i++ + j-- + } +} diff --git a/Week_01/id_29/LeetCode_242_29.go b/Week_01/id_29/LeetCode_242_29.go new file mode 100644 index 00000000..5ddfafac --- /dev/null +++ b/Week_01/id_29/LeetCode_242_29.go @@ -0,0 +1,38 @@ +package main + +// LeetCode - 242. Valid Anagram +// https://leetcode.com/problems/valid-anagram/ +func isAnagram(s string, t string) bool { + if len(s) != len(t) { + return false + } + + mapA := buildCharMap(s) + mapB := buildCharMap(t) + + for key, Acount := range mapA { + Bcount, ok := mapB[key] + if !ok { + return false + } + if Acount != Bcount { + return false + } + } + + return true +} + +func buildCharMap(s string) map[rune]int { + m := make(map[rune]int) + + for _, char := range s { + if _, ok := m[char]; ok { + m[char]++ + } else { + m[char] = 1 + } + } + + return m +} diff --git a/Week_01/id_29/LeetCode_257_29.go b/Week_01/id_29/LeetCode_257_29.go new file mode 100644 index 00000000..a59bca1f --- /dev/null +++ b/Week_01/id_29/LeetCode_257_29.go @@ -0,0 +1,36 @@ +package main + +import "strconv" + +// LeetCode - 257. Binary Tree Paths +// https://leetcode.com/problems/binary-tree-paths/ +func binaryTreePaths(root *TreeNode) []string { + if root == nil { + return nil + } + + res := make([]string, 0, 16) + + dfs("", root, &res) + + return res +} + +func dfs(path string, root *TreeNode, res *[]string) { + if path == "" { + path += strconv.Itoa(root.Val) + } else { + path += "->" + strconv.Itoa(root.Val) + } + + if root.Left != nil { + dfs(path, root.Left, res) + } + if root.Right != nil { + dfs(path, root.Right, res) + } + + if root.Left == nil && root.Right == nil { + *res = append(*res, path) + } +} diff --git a/Week_01/id_29/LeetCode_938_29.go b/Week_01/id_29/LeetCode_938_29.go new file mode 100644 index 00000000..5b78ffe0 --- /dev/null +++ b/Week_01/id_29/LeetCode_938_29.go @@ -0,0 +1,19 @@ +package main + +// LeetCode - 938. Range Sum of BST +// https://leetcode.com/problems/range-sum-of-bst/ +func rangeSumBST(root *TreeNode, L int, R int) int { + return dfs938(root, L, R) +} + +func dfs938(root *TreeNode, L int, R int) int { + if root == nil { + return 0 + } + + if root.Val >= L && root.Val <= R { + return root.Val + dfs938(root.Left, L, R) + dfs938(root.Right, L, R) + } + + return dfs938(root.Left, L, R) + dfs938(root.Right, L, R) +} diff --git a/Week_01/id_29/main.go b/Week_01/id_29/main.go new file mode 100644 index 00000000..28a3ee4d --- /dev/null +++ b/Week_01/id_29/main.go @@ -0,0 +1,16 @@ +package main + +type ListNode struct { + Val int + Next *ListNode +} + +type TreeNode struct { + Val int + Left *TreeNode + Right *TreeNode +} + +func main() { + +}