牛客题霸 [在转动过的有序数组中寻找目标值] C++题解/答案
牛客题霸 [在转动过的有序数组中寻找目标值] C++题解/答案
题目描述
给出一个转动过的有序数组,你事先不知道该数组转动了多少
(例如,0 1 2 4 5 6 7可能变为4 5 6 7 0 1 2).
在数组中搜索给出的目标值,如果能在数组中找到,返回它的索引,否则返回-1。
假设数组中不存在重复项。
题解:
如果全是有序的很好做,就是二分模板
但是现在存在翻转,也就是存在有序部分,也存在无序部分
我们只需要在二分模板中进行判断,如果左侧有序,判断目标值是在有序部分还是无序部分,右侧也是这样
详细看代码
代码:
class Solution {
public:
/**
*
* @param A int整型一维数组
* @param n int A数组长度
* @param target int整型
* @return int整型
*/
int search(int* A, int n, int target) {
// write code here
if(n==0)return -1;
int l=0;
int r=n-1;
while(l<=r)
{
int mid=l+((r-l)>>1);
if(A[mid]==target)return mid;
if(A[l]<A[mid]&&A[l]<=target&&A[mid]>target)r=mid-1;
else if(A[mid]<A[r]&&!(A[mid]<target&&A[r]>=target))r=mid-1;
else l=mid+1;
}
return -1;
}
};