Skip to content

Instantly share code, notes, and snippets.

@EJSohn
Created April 22, 2019 16:37
Show Gist options
  • Select an option

  • Save EJSohn/fda7c5ae940719a934d3ed6f472661c4 to your computer and use it in GitHub Desktop.

Select an option

Save EJSohn/fda7c5ae940719a934d3ed6f472661c4 to your computer and use it in GitHub Desktop.
func searchRange(nums []int, target int) []int {
// empty nums case
if len(nums) == 0 {
return []int{-1, -1}
}
// find starting and ending
return []int{findStarting(nums, target), findEnding(nums, target)}
}
func findStarting(nums []int, target int) int {
// binary search from 0 to len(nums) - 1
lo := 0
hi := len(nums) - 1
for lo <= hi {
mid := (lo + hi) / 2
// < gets starting bound
if nums[mid] < target {
// too low, set lo to mid
lo = mid + 1
} else {
// too high, set hi to mid
hi = mid - 1
}
}
// check lo valid
if lo >= 0 && lo < len(nums) && nums[lo] == target {
return lo
}
return -1
}
func findEnding(nums []int, target int) int {
lo := 0
hi := len(nums) - 1
for lo <= hi {
mid := (lo + hi) / 2
// <= gets ending bound
if nums[mid] <= target {
lo = mid + 1
} else {
hi = mid - 1
}
}
// check hi valid
if hi >= 0 && hi < len(nums) && nums[hi] == target {
return hi
}
return -1
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment