int mySqrt(int x) {
if(x == 0)
return 0;
if(x <=3)
return 1;
long mid = 0;
long right = x;
long left = 0;
while(left < right){
mid = (right - left)/2 + left;
long sqt = mid*mid;
if(sqt < x){
left = mid + 1;
}
else if(sqt == x){
return mid;
}else{
//right = mid-1;
right = mid;
}
}
return (int)right-1;
}
别人的写法:
int mySqrt(int x) {
long mid = 0;
long left = 0;
long right = x;
while (left < right)
{
mid = (left + right + 1) / 2;
long sq = mid * mid; //或者这样也会更快一点
if (sq > x)
{
right = mid - 1;
}
else
{
left = mid;
}
}
return (int)left;
}
分析:这道题的答案可能有两种情况:
1)num 是某个整数的平方,直接返回这个整数就好了。
2)num 恰好在某个区间 [ left, right ),左闭右开区间,其中left 是答案,因此循环结束的条件为 left < right,
要额外注意的两点有:
1)会出现比较大的数字,所以 left 和 right ,mid 的类型至少为 long
2)mid * mid < num 的时候可能是答案,所以 left = mid 就好,不用进一步收缩;
mid * mid > num 的时候一定不是答案,所以 right = mid - 1 就好,需要进一步收缩;