二分法:就是利用条件一次淘汰一边的操作,常用于查找操作。
其实这道题的关键就在于如何断定此时应该向左还是向右找
只需要知道想要去哪个区,当前在哪个区就能将所有条件都罗列出来了。
不就是厘清:1.左(期待的)左(当前在)2.左右3.右左4.右右下如何二分的问题吗?
public int search (int[] nums, int target) {
if(nums==null||nums.length<1) return -1;
//分析左右分区特点:1.左边的最小值比右边最大值还要大
int leftMin = nums[0];
int N = nums.length;
int rightMax = nums[N-1];
int L = 0;
int R = N-1;
boolean maybeLeft = target>=leftMin;//当前在左区还是右区
while(L<=R){
int mid = ((R-L)>>1)+L;
boolean curLeft = nums[mid]>=leftMin;
//总的就是厘清:1.左(期待的)左(当前在)2.左右3.右左4.右右下如何二分的问题
if(nums[mid] == target)
return mid;
else if(nums[mid] < target) {
//左左:向右
//左右:向左
//右左:向右
//右右:向右,就需要仔细考虑左左和右右的情况,剩下两种
if(maybeLeft&&!curLeft){
R = mid-1;
}else{
L = mid+1;
}
}else{
//左左:向左
//左右:向左
//右左:向右
//右右:向左,就需要仔细考虑左左和右右的情况,剩下两种
if(!maybeLeft&&curLeft){
L = mid+1;
}else{
R = mid-1;
}
}
}
return -1;
} 
京公网安备 11010502036488号