34.go 907 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package main
  2. import (
  3. "fmt"
  4. )
  5. // important
  6. func searchRange(nums []int, target int) []int {
  7. beg, end := 0, len(nums)-1
  8. res := []int{-1, -1}
  9. // search left
  10. for beg < end {
  11. mid := (beg + end) / 2
  12. if target > nums[mid] {
  13. beg = mid + 1
  14. } else {
  15. end = mid
  16. }
  17. }
  18. if end == -1 || nums[beg] != target {
  19. return res
  20. }
  21. res[0] = beg
  22. end = len(nums) - 1
  23. // search right
  24. for beg < end {
  25. mid := (beg+end)/2 + 1 // notice: if mid == i, will loop forever
  26. if target < nums[mid] {
  27. end = mid - 1
  28. } else {
  29. beg = mid
  30. }
  31. }
  32. res[1] = end
  33. return res
  34. }
  35. func main() {
  36. a1 := []int{1, 2, 3, 4, 4, 4, 5, 6, 7, 8, 9, 10}
  37. fmt.Println(searchRange(a1, 4))
  38. fmt.Println(searchRange(a1, 5))
  39. fmt.Println(searchRange(a1, 11))
  40. fmt.Println(searchRange(a1, 1))
  41. fmt.Println(searchRange(a1, 10))
  42. a2 := []int{5, 7, 7, 8, 8, 10}
  43. fmt.Println(searchRange(a2, 8))
  44. fmt.Println(searchRange([]int{}, 9))
  45. }