定理1:
When x>=1;
Sqrt(x)>=1.
Sqrt(x)<=x/2+1
1<=Sqrt(x)<=x/2+1
定理2
mid^2<=X<(mid+1)^2
返回middle即可
当x<mid*mid时,mid值太大,需要右指针往左收敛。
当x>=mid*mid时,mid值太小,需要左指针往右收敛。
代码如下:
public int sqrt(int x) {
if (x < 0)
return -1;
if (x == 0)
return 0;
int left = 1;
int right = x / 2 + 1;
while (left <= right) {
int middle = (left + right) / 2;
if (x / middle >= middle && x / (middle + 1) < (middle + 1))
return middle;
if (x / middle < middle)
right = middle - 1;
else
left = middle + 1;
}
return 0;
}