一、 题目
在一个数组中查询一个目标数,给出的是一个有序的数组、元素个数和目标数,不过特别的是这个数组可能是旋转(rotate)的。
例如:数组可能是 0、1、2、4、5、6
也可能是4、5、6、0、1、2
二、 分析
这个题首先我们会想到二分查找,但是仔细想想好像又不是,因为不一定是正序的,还有可能旋转,因为rotate的原因,如果我们取一半的时候可能会出现错误,二分法不是不行,难度在于左右边界的确定,所以我们要做进一步的判断数的精确位置。假设数组是A,每次左边缘为left,右边缘为right,还有中间位置是mid。
分三种情况:
(1)如果target==A[mid],那么mid就是我们要的结果,直接返回;
(3)如果A[mid]>=A[right],那么同样说明从left到mid一定是有序的,同样只需要判断target是否在这个范围内,相应的移动边缘即可。
?
?
class Solution {
public:
int search(int A[], int n, int target) {
if(n==0)
return -1;
int left = 0;
int right = n-1;
int mid;
while(left <= right) {
mid = (left+right)/2;
if(target==A[mid])
return mid;
//确定数组特征
if(A[mid]
A[mid]&&target<=A[right])
left = mid+1;
else
right = mid -1;
}
else if(target>=A[left]&&target
?