image.png

    10111 和 1110111101 这种。此种情况下 nums[start] == nums[mid],分不清到底是前面有序还是后面有序,此时 start++ 即可。相当于去掉一个重复的干扰项。

    1. package main
    2. import "fmt"
    3. func search(nums []int, target int) bool {
    4. left :=0
    5. right :=len(nums)-1
    6. for left<=right{
    7. mid :=left+(right-left)>>1
    8. if nums[mid]==target{
    9. return true
    10. }else if nums[mid]==nums[left]{
    11. left++
    12. } else if nums[left]<nums[mid]{
    13. if nums[left]<=target&&target<nums[mid]{
    14. right =mid-1
    15. }else {
    16. left = mid+1
    17. }
    18. }else {
    19. if nums[mid]<target&&target<=nums[right]{
    20. left = mid+1
    21. }else {
    22. right = mid-1
    23. }
    24. }
    25. }
    26. return false
    27. }
    28. func main() {
    29. fmt.Println(search([]int{2,5,6,0,0,1,2},0))
    30. fmt.Println(search([]int{2,5,6,0,0,1,2},3))
    31. fmt.Println(search([]int{3,1},1))
    32. }

    image.png