不同的是,这道题中出现的重复的元素,所以情况更加复杂一些
如果A[left]<A[middle] 说明左边排好了序,右边可能排好了序,可能没排好序,可能全部相等
如果A[left]>A[middle] 说明左边没有排好序,右边可能拍好了序,可能全部相等,
如果A[left]=A[middle] 说明无法判断左边是否排好序了,这样只能通过移动左指针来寻找1,2的情况
既然我们没办法判断右边,索性我们放弃右边,只判断左边,代码如下
public boolean search(int[] A, int target) {
if (A == null || A.length == 0)
return false;
int left = 0;
int right = A.length - 1;
while (left <= right) {
int middle = (left + right) / 2;
if (target == A[middle])
return true;
if (A[left] < A[middle]) {
if (target >= A[left] && target <= A[middle])
right = middle - 1;
else
left = middle + 1;
}
else if (A[left] > A[middle]) {
if (target >= A[middle] && target <= A[right])
left = middle + 1;
else
right = middle - 1;
}
else
left++;
}
return false;
}