Skip to content

Commit aac182e

Browse files
authored
[Two Pointers][Two Sum II Input Array Is Sorted] - Implement solution for Leetcode 167 (#16)
1 parent 55040a8 commit aac182e

File tree

2 files changed

+110
-0
lines changed

2 files changed

+110
-0
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package twosumiiinputarrayissorted
2+
3+
// Time complexity: O(n^2)
4+
// Space complexity: O(1)
5+
func TwoSumBruteForce(nums []int, target int) []int {
6+
for i := 0; i < len(nums); i++ {
7+
for j := i + 1; j < len(nums); j++ {
8+
if nums[i]+nums[j] == target {
9+
return []int{i + 1, j + 1}
10+
}
11+
}
12+
}
13+
return nil
14+
}
15+
16+
// Time complexity: O(n * log n)
17+
// Space complexity: O(1)
18+
func TwoSumBinarySearch(nums []int, target int) []int {
19+
for i := range nums {
20+
left, right := i+1, len(nums)-1
21+
needed := target - nums[i]
22+
for left <= right {
23+
mid := left + (right-left)/2
24+
if nums[mid] == needed {
25+
return []int{i + 1, mid + 1}
26+
} else if nums[mid] < needed {
27+
left = mid + 1
28+
} else {
29+
right = mid - 1
30+
}
31+
}
32+
}
33+
return nil
34+
}
35+
36+
// Time complexity: O(n)
37+
// Space complexity: O(n)
38+
func TwoSumHashMap(nums []int, target int) []int {
39+
seen := make(map[int]int)
40+
for i, num := range nums {
41+
if j, ok := seen[target-num]; ok {
42+
return []int{i + 1, j + 1}
43+
}
44+
seen[num] = i
45+
}
46+
return nil
47+
}
48+
49+
// Time complexity: O(n)
50+
// Space complexity: O(1)
51+
func TwoSumTwoPointers(nums []int, target int) []int {
52+
left, right := 0, len(nums)-1
53+
for left < right {
54+
sum := nums[left] + nums[right]
55+
if sum == target {
56+
return []int{left + 1, right + 1}
57+
} else if sum < target {
58+
left++
59+
} else {
60+
right--
61+
}
62+
}
63+
return nil
64+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package twosumiiinputarrayissorted
2+
3+
import (
4+
"reflect"
5+
"testing"
6+
)
7+
8+
func TestTwoSum(t *testing.T) {
9+
cases := []struct {
10+
name string
11+
fn func([]int, int) []int
12+
nums []int
13+
target int
14+
expected []int
15+
}{
16+
// TwoSumBruteForce
17+
{"Brute Force - Basic", TwoSumBruteForce, []int{2, 7, 11, 15}, 9, []int{1, 2}},
18+
{"Brute Force - Not Found", TwoSumBruteForce, []int{1, 2, 3}, 10, nil},
19+
{"Brute Force - Single", TwoSumBruteForce, []int{5}, 5, nil},
20+
{"Brute Force - Negative Numbers", TwoSumBruteForce, []int{-3, 0, 3, 4}, 0, []int{1, 3}},
21+
22+
// TwoSumBinarySearch
23+
{"Binary Search - Basic", TwoSumBinarySearch, []int{2, 7, 11, 15}, 9, []int{1, 2}},
24+
{"Binary Search - Not Found", TwoSumBinarySearch, []int{1, 2, 3}, 6, nil},
25+
{"Binary Search - Negative Numbers", TwoSumBinarySearch, []int{-4, -1, 1, 2, 5}, 1, []int{1, 5}},
26+
27+
// TwoSumHashMap
28+
{"Hash Map - Basic", TwoSumHashMap, []int{2, 7, 11, 15}, 9, []int{2, 1}},
29+
{"Hash Map - Not Found", TwoSumHashMap, []int{1, 2, 3}, 0, nil},
30+
{"Hash Map - Negative", TwoSumHashMap, []int{-3, 4, 3, 90}, 0, []int{3, 1}},
31+
32+
// TwoSumTwoPointers
33+
{"Two Pointers - Basic", TwoSumTwoPointers, []int{2, 7, 11, 15}, 9, []int{1, 2}},
34+
{"Two Pointers - Not Found", TwoSumTwoPointers, []int{1, 2, 3}, 7, nil},
35+
{"Two Pointers - Edge", TwoSumTwoPointers, []int{-10, -3, 0, 1, 6}, -3, []int{2, 3}},
36+
}
37+
38+
for _, c := range cases {
39+
t.Run(c.name, func(t *testing.T) {
40+
got := c.fn(c.nums, c.target)
41+
if !reflect.DeepEqual(got, c.expected) {
42+
t.Errorf("%s failed: expected %v, got %v", c.name, c.expected, got)
43+
}
44+
})
45+
}
46+
}

0 commit comments

Comments
 (0)