From cda66565989e6f25ead6df9f80db0c2508b72ac8 Mon Sep 17 00:00:00 2001 From: Jason Staten Date: Tue, 4 Oct 2022 23:23:48 -0600 Subject: [PATCH] binary search --- binarysearch/binarysearch.go | 36 ++++++++++++++++++++++++++++ binarysearch/binarysearch_test.go | 39 +++++++++++++++++++++++++++++++ binarysearch/readme.md | 29 +++++++++++++++++++++++ 3 files changed, 104 insertions(+) create mode 100644 binarysearch/binarysearch.go create mode 100644 binarysearch/binarysearch_test.go create mode 100644 binarysearch/readme.md diff --git a/binarysearch/binarysearch.go b/binarysearch/binarysearch.go new file mode 100644 index 0000000..27d60d0 --- /dev/null +++ b/binarysearch/binarysearch.go @@ -0,0 +1,36 @@ +package binarysearch + +import "sort" + +func search(nums []int, target int) int { + start := 0 + end := len(nums) - 1 + for start <= end { + mid := (start + end) / 2 + if nums[mid] == target { + return mid + } else if nums[mid] > target { + end = mid - 1 + } else if nums[mid] < target { + start = mid + 1 + } + } + + return -1 +} + +func Search(nums []int, target int) int { + return search(nums, target) +} + +// Uses sort.SearchInts +func SearchStdLib(nums []int, target int) int { + idx, found := sort.Find(len(nums), func(i int) int { + return target - nums[i] + }) + + if found { + return idx + } + return -1 +} diff --git a/binarysearch/binarysearch_test.go b/binarysearch/binarysearch_test.go new file mode 100644 index 0000000..935417b --- /dev/null +++ b/binarysearch/binarysearch_test.go @@ -0,0 +1,39 @@ +package binarysearch_test + +import ( + "testing" + + bs "git.jxs.me/leetgo/binarysearch" + "github.com/stretchr/testify/require" +) + +func TestEmpty(t *testing.T) { + require.Equal(t, -1, bs.Search([]int{}, 7)) +} + +func TestSingle(t *testing.T) { + require.Equal(t, 0, bs.Search([]int{6}, 6)) +} + +func TestTwo(t *testing.T) { + require.Equal(t, -1, bs.Search([]int{2, 5}, 0)) +} + +func TestMulti(t *testing.T) { + require.Equal(t, 5, bs.Search([]int{1, 2, 3, 4, 5, 6, 7}, 6)) +} +func TestMultiEnd(t *testing.T) { + require.Equal(t, 6, bs.Search([]int{1, 2, 3, 4, 5, 6, 7}, 7)) +} + +func TestMultiStart(t *testing.T) { + require.Equal(t, 0, bs.Search([]int{1, 2, 3, 4, 5, 6, 7}, 1)) +} + +func TestExample1(t *testing.T) { + require.Equal(t, 4, bs.Search([]int{-1, 0, 3, 5, 9, 12}, 9)) +} + +func TestExample2(t *testing.T) { + require.Equal(t, -1, bs.Search([]int{-1, 0, 3, 5, 9, 12}, 2)) +} diff --git a/binarysearch/readme.md b/binarysearch/readme.md new file mode 100644 index 0000000..a4aafeb --- /dev/null +++ b/binarysearch/readme.md @@ -0,0 +1,29 @@ +704. Binary Search +Easy + +Given an array of integers nums which is sorted in ascending order, and an integer target, write a function to search target in nums. If target exists, then return its index. Otherwise, return -1. + +You must write an algorithm with O(log n) runtime complexity. + + + +Example 1: + +Input: nums = [-1,0,3,5,9,12], target = 9 +Output: 4 +Explanation: 9 exists in nums and its index is 4 + +Example 2: + +Input: nums = [-1,0,3,5,9,12], target = 2 +Output: -1 +Explanation: 2 does not exist in nums so return -1 + + + +Constraints: + + 1 <= nums.length <= 104 + -104 < nums[i], target < 104 + All the integers in nums are unique. + nums is sorted in ascending order.