已知存在一个按非降序排列的整数数组
nums,数组中的值不必互不相同。在传递给函数之前,
nums在预先未知的某个下标k(0 <= k < nums.length)上进行了 旋转 ,使数组变为[nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 开始 计数)。例如,[0,1,2,4,4,4,5,6,6,7]在下标5处经旋转后可能变为[4,5,6,6,7,0,1,2,4,4]。给你 旋转后 的数组
nums和一个整数target,请你编写一个函数来判断给定的目标值是否存在于数组中。如果nums中存在这个目标值target,则返回true,否则返回false。你必须尽可能减少整个操作步骤。
 
 
class Solution {
    public boolean search(int[] nums, int target) {
 
        if(nums.length == 0){
            return false;    
        }
        int left = 0, right = nums.length - 1;
        while(left <= right){
            int mid = left + (right - left) / 2;
            if(nums[mid] == target){
                return true;
            }
            if(nums[left] == nums[mid] && nums[right] == nums[mid]){
                left++;
                right--;
            }
            //左半边有序,在左半边使用二分查找
            else if(nums[mid] >= nums[left]){
                if(nums[left] <= target && target < nums[mid]){ //target处于[0,mid),向左移动mid           
                 right = mid - 1;
                    
                }
                else{
                    left = mid + 1;
                }
            }
            //右半边有序,在右半边使用二分查找
            else{
                if(nums[mid] < target && target <= nums[nums.length - 1]){
                    left = mid + 1;
                }
                else{
                    right = mid - 1;
                }
            }
        }
    return false;
 
    }
}



















