可以用暴力解决
int mySqrt(int x) {//求x的算数平方根
long int y = 0;
while(y*y<=x)
{
y++;
}
return y - 1;
}
也可以用二分法
int mySqrt(int x) {//求x的算数平方根
long int y = 0;
long int left = 0, right = x, mid = left + (right - left) / 2;
if (x == 1)
return 1;
if (x == 0)
return 0;
while (left <= right)
{
mid = left + (right - left) / 2;
if (x / mid == mid)
return mid;
else if (x / mid > mid)
{
left = mid + 1;
}
else
right = mid - 1;
}
return right;
}
用二分法解决有一个我觉得很重要的思路就是return right.
我的理解是:
范围再怎么缩小,最终都会到 left==right==mid 的情况
而此时,mid要么比平方根大1,要么小1.
如果x/mid>mid 则说明mid是满足mid*mid<=x 的最大整数,根据我们的循环机制,改变的就是left,最后跳出循环,返回right也满足条件。
如果x/mid<mid 则说明mid是满足mid*mid>x的最小整数,也就是说mid比x的平方根的整数部分大1,根据循环机制,right-1, 跳出循环后返回right 满足条件