33.go 886 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package main
  2. func searchOld(nums []int, target int) int {
  3. for i, v := range nums {
  4. if v == target {
  5. return i
  6. }
  7. }
  8. return -1
  9. }
  10. func search(nums []int, target int) int {
  11. beg, end := 0, len(nums)-1
  12. mid := -1
  13. // find the smallest one in nums
  14. for beg < end {
  15. mid = (beg + end) / 2
  16. if nums[mid] > nums[end] {
  17. beg = mid + 1
  18. } else {
  19. end = mid
  20. }
  21. }
  22. if mid == -1 || target == nums[mid] {
  23. return mid
  24. }
  25. // judge which area to search
  26. if target > nums[len(nums)-1] {
  27. beg, end = 0, mid-1
  28. } else {
  29. beg, end = mid+1, len(nums)-1
  30. }
  31. // binary search
  32. for beg <= end {
  33. mid = (beg + end) / 2
  34. if target > nums[mid] {
  35. beg = mid + 1
  36. } else if target < nums[mid] {
  37. end = mid - 1
  38. } else {
  39. return mid
  40. }
  41. }
  42. return -1
  43. }
  44. /* func main() {
  45. a1 := []int{4, 5, 6, 0, 1, 2, 3}
  46. a2 := []int{1, 3}
  47. fmt.Println(search(a1, 6))
  48. fmt.Println(search(a2, 3))
  49. } */