考点在于binary search 结束条件和overflow.
用loop invariant来理解: 每次loop都保证 [low,high]左边是严格小的,右边是严格大的.
public class Solution {
public int mySqrt(int x) {
int low=1, high=x;
if(x==0 || x==1)return x;
while(low<=high)
{
int mid=low+(high-low)/2; //防止overflow,并且奇偶统一
int q=x/mid; //防止overflow
if(q==mid)return mid;
if(mid<q)low=mid+1;
else if(mid>q)high=mid-1;
}
return high;
}
}
然后是follow up, 一般是double版
public double sqrtDouble(double x) {
double lo = 0;
double hi = x;
double tolerance = 0.00000000000001;
if (x < 1) {
hi = 1;
}
while (lo <= hi && (hi - lo) > tolerance ) {
double mid = lo + (hi-lo)/2;
if (mid > x / mid) {
hi = mid;
} else if (mid < x / mid) {
lo = mid;
} else {
return mid;
}
}
return lo + (hi-lo)/2;
}