二分法:就是利用条件一次淘汰一边的操作,常用于查找操作。
其实这道题的关键就在于如何断定此时应该向左还是向右找
只需要知道想要去哪个区,当前在哪个区就能将所有条件都罗列出来了。
不就是厘清: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; }