与中间值比较,分前半段有序和后半段有序分别判断。比有序的二分查找多一些判定条件。
1、 要么前半段有序,要么后半段有序。
2、 当前半段有序时:即循环数组中间值比循环数组最左边值大 则 nums[left] <= nums[mid]
当target 比中间值小,比最左值(前半段最小值)大时,肯定在前面部分 则high = mid - 1 。
如果不在前半段,可能在后半段,low = mid + 1。
3、同理后半段也一样。
ps:分前半段有序后半段有序时,当nums[left] <= nums[mid] 则 left到mid有序。
否则 mid到right 有序。

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0, right = nums.size() - 1;
        while(left <= right){
            int mid = (right - left)/2 + left;
            if(nums[mid] == target) return mid; 
            // 中间值不是要求值 
            if(nums[left] <= nums[mid]){ // 前半段 有序left 到 mid
                if(nums[left] <= target && target < nums[mid]){ 
                // 中间值 大于目标值, 目标值大于最左边值 肯定在前半段
                    right = mid - 1;
                }
                else{ // 否则重新找
                    left = mid + 1;
                }
            }
            else{ // 前半段无序,后半段有序 mid到right
                if(nums[mid] < target && target <= nums[right]){
                    left = mid + 1;
                }
                else {
                    right = mid - 1;
                }
            }
        }
        return -1;
    }
};