可以采用二分查找。
分为3种情况:
一, 5, 6, 1, 2, 3 即a[mid] < a[start] && a[mid] <= a[end]
二,5, 6, 7, 1, 2 即a[mid] >= a[start] && a[mid] > a[end]
三,1, 2, 3, 4, 5 即a[mid] >= a[start] && a[mid] <= a[end]
这三种情况是针对数组旋转之后的结果分的。当然,对于每一类,我们还需要考虑是排除前一半还是后一半。
class Solution {
public:
int b_s(int a[], int start, int end, int target)
{
if(start > end) return -1;
int mid = (start + end) >> 1;
if(a[mid] == target) return mid;
if(a[start] > a[mid] && a[mid] <= a[end])
{
if(a[mid] > target || (a[end] < target))
return b_s(a, start, mid - 1, target);
else return b_s(a, mid + 1, end, target);
}
else if(a[mid] >= a[start] && a[mid] > a[end])
{
if(a[mid] < target || target < a[start])
return b_s(a, mid + 1, end, target);
else return b_s(a, start, mid - 1, target);
}
else
{
if(a[mid] > target) return b_s(a, start, mid - 1, target);
else return b_s(a, mid + 1, end, target);
}
}
int search(int A[], int n, int target) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
return b_s(A, 0, n - 1, target);
}
};