采用二分法的思想
-
采用二分法,主要是mid与一个target比较,普通的二分查找target是给出来的,但有时没有明确的target,比如这道题,这时一般选择端点当作target,即
l
或r
。 -
端点的选择问题:对与这道题,应该选择
r
,如图所示,倾斜的实线代表序列上升的趋势。
-
选择
r
:当mid>r时,显然寻找的min在mid右边。所以区间放缩:
l=mid+1
。当mid<r时,min可能在mid的左边,但min也可能就是mid(因为min也小于r),所以区间放缩为:
r=mid
。当mid=r时,注意到序列非减,即存在mid到r全部相等的情况,这时min应在mid左边,也或者min=mid=……=r。所以这里也放缩为
r = mid
。 -
选择
l
:事实上,选择
l
时走不通的,我刚开始就是选择的l
,然后写的心力憔悴也过不了。还是如上图所示:当mid>l时,特殊情况下,min在mid左边, 一般情况下 min 在mid右边,这就导致在进行放缩时无法采用相同的策略,也就无法简单的使用循环二分来解题了。
-
代码:
import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
if(array.length==0)return 0;
int l=0,r=array.length-1;
while(l<r){
int mid = (l+r)>>1;
if(array[mid]<=array[r])r=mid;
else l=mid+1;
}
return array[l];
}
}