牛客题霸 [在转动过的有序数组中寻找目标值] 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;
    }
};