牛客题霸 [在转动过的有序数组中寻找目标值] C++题解/答案

牛客题霸 [在转动过的有序数组中寻找目标值] C++题解/答案

题目描述

给出一个转动过的有序数组,你事先不知道该数组转动了多少
(例如,0 1 2 4 5 6 7可能变为4 5 6 7 0 1 2).
在数组中搜索给出的目标值,如果能在数组中找到,返回它的索引,否则返回-1。
假设数组中不存在重复项。

题解:

如果全是有序的很好做,就是二分模板
但是现在存在翻转,也就是存在有序部分,也存在无序部分
我们只需要在二分模板中进行判断,如果左侧有序,判断目标值是在有序部分还是无序部分,右侧也是这样
详细看代码

代码:

class Solution {
public:
    /**
     * 
     * @param A int整型一维数组 
     * @param n int A数组长度
     * @param target int整型 
     * @return int整型
     */
    int search(int* A, int n, int target) {
        // write code here
        if(n==0)return -1;
        int l=0;
        int r=n-1;
        while(l<=r)
        {
            int mid=l+((r-l)>>1);
            if(A[mid]==target)return mid;
            if(A[l]<A[mid]&&A[l]<=target&&A[mid]>target)r=mid-1;
            else if(A[mid]<A[r]&&!(A[mid]<target&&A[r]>=target))r=mid-1;
            else l=mid+1;
        }
        return -1;
    }
};
posted @ 2020-12-02 18:11  回归梦想  阅读(164)  评论(0编辑  收藏  举报