二分法:就是利用条件一次淘汰一边的操作,常用于查找操作。
其实这道题的关键就在于如何断定此时应该向左还是向右找
只需要知道想要去哪个区,当前在哪个区就能将所有条件都罗列出来了。
不就是厘清:1.左(期待的)左(当前在)2.左右3.右左4.右右下如何二分的问题吗?

    public int search (int[] nums, int target) {
        if(nums==null||nums.length<1) return -1;
        //分析左右分区特点:1.左边的最小值比右边最大值还要大
        int leftMin = nums[0];
        int N = nums.length;
        int rightMax = nums[N-1];
        int L = 0;
        int R = N-1;
        boolean maybeLeft = target>=leftMin;//当前在左区还是右区
        while(L<=R){
            int mid = ((R-L)>>1)+L;
            boolean curLeft = nums[mid]>=leftMin;
            //总的就是厘清:1.左(期待的)左(当前在)2.左右3.右左4.右右下如何二分的问题
            if(nums[mid] == target) 
                return mid;
            else if(nums[mid] < target) {
                //左左:向右
                //左右:向左
                //右左:向右
                //右右:向右,就需要仔细考虑左左和右右的情况,剩下两种
                if(maybeLeft&&!curLeft){
                    R = mid-1;
                }else{
                    L = mid+1;
                }
            }else{
               //左左:向左
               //左右:向左
               //右左:向右
               //右右:向左,就需要仔细考虑左左和右右的情况,剩下两种
               if(!maybeLeft&&curLeft){
                   L = mid+1;
               }else{
                   R = mid-1;
               }
            }
        }
        return -1;
    }