描述:给定一个有序数组经过部分旋转,如{0,1,2,3,4,5,6}旋转后{4,5,6,0,1,2,3};给定key值,若查找成功则返回数组中key值元素索引,否则返回-1。
思路一:暴力法,从数组头遍历到尾部,依次查找。
class Solution{
public:
int search(int A[],int n,int value)
{
if(n==0)return -1;
for(int i=0;i<n;i++)
{
if(A[i]==value)return i;
}
return -1;
}
};
思路二:利用二分查找。
class Solution{
public:
int search(int A[],int n,int value)
{
if(n==0)return -1;
int first=0;
int last=n-1;
while(first!=last)
{
const int mid=first+(last-first)/2;
if(A[mid]==value) return mid;
if(A[first]<A[mid])//分两种情况:1.前半部分有序2.后半部分有序
{
if(A[first]<=value&&A[mid]>value)
{
last=mid-1;
}
else
{
first=mid+1;
}
}
else
{
if(A[mid]<value&&A[last]>=value)
{
first=mid+1;
}
else
{
last=mid-1;
}
}
}
return -1;
}
};