在旋转数组中找target
题目描述
给出一个转动过的有序数组,你事先不知道该数组转动了多少
(例如,0 1 2 4 5 6 7可能变为4 5 6 7 0 1 2).
在数组中搜索给出的目标值,如果能在数组中找到,返回它的索引,否则返回-1。
假设数组中不存在重复项。
思路
数组有序首选二分,但是题目中数组并非完全有序,而是因为旋转的原因导致数组被分割成了两个有序数组,当我们二分查找的时候,总能找到一边的数组时有序的,那么此时我们就根据这个个有序的数组来判断是否target在其中,如果不在那么target然存在于另外一半的数组中,不断二分做这种判断,直到我们找到目标值,如果没找到说明数组中不存在target
int search(int* A, int n, int target) {
// write code here
int left = 0;
int right = n;
while(left < right)
{
int mid = left + (right - left) / 2;
if(target == A[mid])
return mid;
//先找有序的一半
if(A[mid] < A[right - 1])
{
//判断target是否在其中,不在说明target在无序的一半中
if(target >= A[mid + 1] && target <= A[right - 1])
left = mid + 1;
else
right = mid;
}
else
{
if(target >= A[left] && target <= A[mid - 1])
right = mid;
else
left = mid + 1;
}
}
return -1;
}