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

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

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;
    }
全部评论

相关推荐

程序员牛肉:1.大头肯定是院校问题,这个没啥说的。 2.虽然有实习,但是实习的内容太水了,在公司待了七个月的时间,看起来就只做了jwt和接入redis。爬取新闻,数据导入。这几个需求值得你做七个月吗?这不就是三四个月的工作量吗?我要是面试官的话真心会认为你能力不太行。所以既然有实习了,一定要好好写,像是Swagger这种东西是真没必要写上去,就拉一个包的事情。 3.我个人觉得话,在校生不要把自己当社招看,除非你的项目是特别牛逼,特别有名的含金量,否则不要写这种密密麻麻的一串子工作职责。你的项目只有一个作用,就是供面试官从中来抽取八股对你进行拷打。 但是你现在这个看不来什么技术点,可以改一下,详细表述一下你用什么技术实现了什么功能,在实现这个功能的过程中,你解决了什么难题。
点赞 评论 收藏
分享
评论
5
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务