在被右移过的有序数组中查找

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

http://www.nowcoder.com/questionTerminal/7cd13986c79d4d3a8d928d490db5d707

思路:

1.先二分法找到转动的点,
A[mid]和A[0] 做比较大于等于 就说明落到了交接点左边,这时移动 s 指针让mid 向右边靠,反则
移动e 指针让 mid向左靠,最终 s 会落在交接点右边, e 指针会落在交界的 左边
开始:
图片说明
结束:
图片说明

2.这样就得到2个有序数组了,接着就是一个二分查找

       public int search (int[] A, int target) {
        //没翻转
        if(A[0] <= A[A.length - 1]){
            return binarySearch(A, target, 0, A.length - 1);
        }
        // 找到翻转的点
        int s = 0;
        int e = A.length - 1;
        int mid;
        while (s <= e){
            mid = (s + e) / 2;
            if(A[mid] >= A[0]){
                s = mid + 1;
            }else {
                e = mid - 1;
            }
        }
        // 确定target在翻转点的右边还是左边
        if(target >= A[0]){
            return  binarySearch(A, target, 0, e);
        }else {
            return  binarySearch(A, target, s, A.length - 1);
        }

    }

    public int binarySearch(int[] a, int target, int s, int e){
        int mid;
        while (s <= e){
            mid = (s + e) / 2;
            if(a[mid] > target){
                e = mid -1;
            }else if (a[mid] == target){
                return mid;
            }else {
                s = mid + 1;
            }
        }
        return -1;
    }
全部评论

相关推荐

叶扰云倾:进度更新,现在阿里云面完3面了,感觉3面答得还行,基本都答上了,自己熟悉的地方也说的比较细致,但感觉面试官有点心不在焉不知道是不是不想要我了,求阿里收留,我直接秒到岗当阿里孝子,学校那边的房子都退租了,下学期都不回学校,全职猛猛实习半年。这种条件还不诱人吗难道 然后现在约到了字节的一面和淘天的复活赛,外加猿辅导。华为笔试完没动静。 美团那边之前投了个base广州的,把我流程卡麻了,应该是不怎么招人,我直接简历挂了,现在进了一个正常的后端流程,还在筛选,不知道还有没有hc。
点赞 评论 收藏
分享
野猪不是猪🐗:我assume that你must技术aspect是solid的,temperament也挺good的,however面试不太serious,generally会feel style上不够sharp
点赞 评论 收藏
分享
评论
5
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务