81.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package main
  2. import (
  3. "fmt"
  4. )
  5. // ??? so many problems here
  6. func search(nums []int, target int) bool {
  7. if len(nums) == 0 {
  8. return false
  9. }
  10. beg, end := 0, len(nums)-1
  11. var mid int
  12. // how to find the smallest num of arr?
  13. for beg < end {
  14. mid = (beg + end) / 2
  15. if nums[mid] > nums[end] {
  16. beg = mid + 1
  17. } else if nums[mid] < nums[end] {
  18. end = mid - 1
  19. } else {
  20. for nums[mid] < nums[(mid+1)%len(nums)] {
  21. mid = (mid + len(nums) - 1) % len(nums)
  22. }
  23. break
  24. }
  25. }
  26. fmt.Println(mid)
  27. if target == nums[mid] {
  28. return true
  29. }
  30. if target < nums[0] {
  31. beg, end = mid+1, len(nums)-1
  32. } else {
  33. beg, end = 0, mid-1
  34. }
  35. for beg <= end {
  36. mid = (beg + end) / 2
  37. if target < nums[mid] {
  38. end = mid - 1
  39. } else if target > nums[mid] {
  40. beg = mid + 1
  41. } else {
  42. return true
  43. }
  44. }
  45. return false
  46. }
  47. func main() {
  48. a1 := []int{4, 5, 6, 6, 6, 7, 7, 0, 0, 1, 1, 2, 2, 3}
  49. fmt.Println(search(a1, 6))
  50. fmt.Println(search(a1, 4))
  51. fmt.Println(search(a1, 3))
  52. fmt.Println(search(a1, 7))
  53. fmt.Println(search(a1, 9))
  54. a2 := []int{1, 3}
  55. fmt.Println(search(a2, 3))
  56. a3 := []int{3, 1}
  57. fmt.Println(search(a3, 3))
  58. fmt.Println(search(a3, 1))
  59. }