1,题目
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入: 4
输出: 2
示例 2:
输入: 8
输出: 2
说明: 8 的平方根是 2.82842...,
由于返回类型是整数,小数部分将被舍去。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sqrtx
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2.题解
二分法
直接固定左边界为0,有边界为x,进行二分;
注意:这里一定取右中位数,如果取左中位数,代码可能会进入死循环
class Solution
{
public:
int mySqrt(int x)
{
int left=0;
int right=x;
while(left < right)
{
int mid=(long)left+right+1 >> 1;
if(mid<=x/mid)
{
left=mid;
}
else
{
right=mid-1;
}
}
return left;
}
};
牛顿迭代
牛顿迭代法就是借助泰勒级数,从初始值开始快速向零点逼近。
y = f(x) = x*x − C
我们取一个初始值x0,取直线x = x0与函数图像的交点,做切线与x轴继续相交,迭代多次,知道两次xi的距离小于一定的阈值,即可得到符合误差要求的解,也就找到了x的平方根。
class Solution
{
public:
int mySqrt(int x)
{
if (x == 0)
{
return 0;
}
double C = x, x0 = x;
while (true)
{
double xi = 0.5 * (x0 + C / x0);
if (fabs(x0 - xi) < 1e-7)
{
break;
}
x0 = xi;
}
return int(x0);
}
};