题解 | #在旋转过的有序数组中寻找目标值#

在旋转过的有序数组中寻找目标值

http://www.nowcoder.com/practice/87c0e7abcbda41e7963660fa7d020995

二分法:就是利用条件一次淘汰一边的操作,常用于查找操作。
其实这道题的关键就在于如何断定此时应该向左还是向右找
只需要知道想要去哪个区,当前在哪个区就能将所有条件都罗列出来了。
不就是厘清: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;
    }
全部评论

相关推荐

Elastic90:公司不要求加班,但 又不允许你准点下班,经典又当又立
点赞 评论 收藏
分享
感谢信收割机Rain:他昨天还和我打瓦,今天咋这样发邮件😅
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务