将一个有序数组进行旋转,如0 1 2 4 5 6 7 -> 4 5 6 7 0 1 2,要求在旋转后的数组中查找某数,假定该数组中没有重复的数。
int find(int a[], int n, int k)
{
int left = 0;
int right = n-1;
while (left <= right)
{
int mid = left + (right-left)/2;
if (k == a[mid])
{
return mid;
}
if (a[left] <= a[mid])
{
if (k < a[mid] && k >= a[left])
{
right = mid - 1;
}
else
{
left = mid + 1;
}
}
else
{
if (k <= a[right] && k > a[mid])
{
left = mid + 1;
}
else
{
right = mid - 1;
}
}
}
return -1;
}
进一步,要求找到旋转数组中的最小值。
int findMin(int a[], int n)
{
int left = 0;
int right = n - 1;
while (left < right)
{
int mid = left + (right-left)/2;
if (a[mid] < a[right])
{
right = mid;
}
else
{
left = mid + 1;
}
}
return left;
}