33.go 899 B

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