当x较大时,中间变量mid由于类型是int(和函数返回值类型一致), mid * mid会溢出,导致实际结果可能是负数,所以要先强转成long再相乘,或者用mid和x/mid比较。
public class Solution {
public int MySqrt(int x) {
int left=0;
int right=x;
int ans=-1;
while(left<=right)
{
int mid=((right-left)>>1)+left;
if(mid>x/mid)
{
right=mid-1;
}
else if(mid<=x/mid)
{
ans=mid;
left=mid+1;
}
}
return ans;
}
}
或
public class Solution {
public int MySqrt(int x) {
int left=0;
int right=x;
int ans=-1;
while(left<=right)
{
int mid=((right-left)>>1)+left;
if((long)mid*mid>x)
{
right=mid-1;
}
else if((long)mid*mid<=x)
{
ans=mid;
left=mid+1;
}
}
return ans;
}
}