Implement int sqrt(int x)
.
Compute and return the square root of x.
class Solution {
public:
int sqrt(int x) {
// binary search implementation
if (x < 2) return x;
int l = 1, r = x/2; // 初值设为一半
int ans = 1;
while (l <= r)
{
int mid = l + (r - l) / 2; // 防止溢出
if (x / mid == mid)
return mid;
else if (x / mid < mid)
r = mid - 1;
else
{
l = mid + 1;
ans = mid; // 由于取下整,每次记录较小的迭代值
}
}
return ans;
}
};
此外,此题也可使用牛顿迭代法。
为了保持符号与题目一致,这里使用纵坐标为a=0,横坐标为b=0的a-b平面直角坐标系。
设f(a) = a^2 - x (注意未知数为a)
牛顿迭代法就是为了求f(a)=0时的正数解。它的记忆可以基于图形的记忆法:a的下一个迭代点a'就是以曲线b=f(a)上在(a,f(a))处的切线与横坐标b=0的交点。
那么 a' = a - f(a)/f'(a) = a - (a^2-x)/(2a) = (a + x/a)/2
一直迭代上式即可收敛。
关于收敛的条件可以搜索“不动点迭代法”查询相关资料。
代码如下:
class Solution {
public:
int sqrt(int x) {
if (x <= 0) return 0;
double y = x, tmp;
const double eps = 1e-10;
// newton iteration
while (abs((tmp = (y + x/y) / 2.0) - y) > eps)
y = tmp;
return (int)y;
}
};