看到时间复杂度要求是O(logn)所以首先想到的还是二分查找,但是这个查找不是完全有序的,而是两段升序的。算法需要找到规律判断下一次搜索应该在哪个区间。如果中间的数小于最右边的数,则右半段是有序的,若中间数大于最右边数,则左半段是有序的,我们只要在有序的半段里用首尾两个数组来判断目标值是否在这一区域内,这样就可以确定保留哪半边了。
class Solution {
public:
int search(vector<int> &A, int target) {
int head = 0;
int tail = A.size() - 1;
int mid;
while (head <= tail)
{
mid = (head + tail) / 2;
if (A[mid] == target) return mid;
if (target > A[mid])
{
if (A[mid] <= A[tail])
if (target <= A[tail]) head = mid + 1;
else tail = mid - 1;
else head = mid + 1;
}
if (target < A[mid])
{
if (A[head] <= A[mid])
if (target >= A[head]) tail = mid - 1;
else head = mid + 1;
else tail = mid - 1;
}
}
return -1;
}
};