二分查找,每次取中值来和target判断收缩范围是最容易想到的解决办法。这道题由于数组不是完全有序的,所以需要多考虑一步。 其实方法一样,仔细想想,这种两段有序数组无论取哪个点,其左右总是至少有一段是完全有序的。那么我们完全可以判断target是否出现在有序的那段从而实现二分。
class Solution {
public:
int search(int A[], int n, int target) {
int st=0,ed=n-1;
while( st <= ed )
{
int mid = (st+ed)/2;
if( A[mid] == target )
{
return mid;
}
if( A[mid]>=A[st] )
{
if( target >= A[st] && target < A[mid] )
{
ed = mid-1;
}
else
{
st = mid+1;
}
}
else
{
if( target>A[mid] && target <= A[ed] )
{
st = mid+1;
}
else
{
ed = mid-1;
}
}
}
return -1;
}
};