Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7
might become 4 5 6 7 0 1 2
).
You are given a target value to search. If found in the array return its index, otherwise return -1.
You may assume no duplicate exists in the array.
这个题是我比较怵的,各种各样的细节问题等着你去发现,我花了半个小时考虑各种情况,还是四次才过,好不爽。
class Solution {
private:
int find(int A[], int n)//n >= 2
{
int l = 0, r = n - 1;
int mid = r / 2 + r % 2;//n == 2时mid == 0出问题
while(l <= r)
{
if(A[mid] > A[0])
{
l = mid + 1;
if(l >= n)//必须有等与,否则l无法过界//这是rotate(0)的情况
{
return 0;
}
mid = (l + r) / 2 + (l + r) % 2;
}
else if(A[mid] < A[0])
{
if(A[mid - 1] >= A[0])//rotate(n - 1)的情况
{
return mid;
}
r = mid - 1;
mid = (l + r) / 2 + (l + r) % 2;
}
}
return mid;
}
public:
int search(int A[], int n, int target) {
if(n < 1)
{
return -1;
}
else if(n == 1)
{
return target == A[0] ? 0 : -1;
}
int org = find(A, n);
int i = 0, j = n - 1;
int mid = j / 2;
while(i < j)
{
if(A[(org + mid) % n] < target)
{
i = mid + 1;
mid = (i + j) / 2;
}
else if(A[(org + mid) % n] > target)
{
j = mid - 1;
mid = (i + j) / 2;
}
else
{
break;
}
}
if(A[(org + mid) % n] == target)//不小心在这里用了mid。。。
{
return (org + mid) % n;
}
else
{
return -1;
}
}
};