二分查找的时间复杂度是0(logn),其实质是将一段数据分成两个不同性质子数据段,很多题都可以转换成二分的思想。模板如下(来自y总)
模板一
while(l<r){
int mid = (l+r)>>1;
if(mid>=check(k)) r = mid;//check(k)是我们要划分的问题,mid大于它说明mid需要左移,因此通过更新r
else l = mid+1;
}
模板二
while(l < r){
int mid = (l+r+1)>>1;
if(mid <=check(k)) l = mid;
else r = mid - 1;
}
两个模板最大的区别就是mid,模如果板二mid=(l+r+1)>>1;是因为我们首先要更新的是l;而当r -1= l时,如果用原先的mid的话,mid = 0,所以我们这里加一防止边界问题。
这里上例题可以自行体会两个模板1. https://leetcode-cn.com/problems/sqrtx/submissions/https://leetcode-cn.com/problems/valid-perfect-square/solution/you-xiao-de-wan-quan-ping-fang-shu-by-le-wkee/