//C++最简洁的二分法分类讨论
//每次二分,左半部分和右半部分至少有一边是有序的,以此为条件可以分成两种情况:
//1、左半边是有序的
//(1) target落在左半边
//(2) otherwise
//2、右半边是有序的
//(1) target落在右半边
//(2) otherwise
//综上所述,一共两种可能性,这两种情况各自又有两种可能性,代码如下:
public static boolean search(int[] nums, int target) {
if(nums.length < 1)return false;
if(nums.length == 1) return nums[0]==target;
return midSearch(nums,target,0,nums.length-1);
}
private static boolean midSearch(int[] nums, int target, int l, int r) {
while (l <= r){
while (l<r && nums[l]==nums[l+1])l++;
while (l<r && nums[r]==nums[r-1])r--;
int mid = (l+r)>>1;
if(nums[mid]==target)return true;
if(nums[mid] >= nums[l]){
if(target >= nums[l] && target < nums[mid])r = mid-1;
else l=mid+1;
}else {
if(target > nums[mid] && target <= nums[r])l = mid+1;
else r=mid-1;
}
}
return false;
}