此题很有意思,可以用二分法,也可以使用数学方法。二分法的话,要小心类型的溢出。
二分法代码:
class Solution {
public:
int mySqrt(int x) {
long long i=0, j = x, mid, xL = x; //防止溢出,全部转化为long long类型
while (i<=j) {
mid = i+((j-i)>>1);
if (mid*mid>xL) {
j = mid-1;
} else if (mid*mid<xL) {
i = mid+1;
} else {
return (int)mid;
}
}
return (int)j;
}
};
数学方法:
采用牛顿法,先假设一个初始解res(本文设为1.0),然后以抛物y = x^2-c(这里的c相当于题目中的x)上的点(res, res^2-c)为切点作切线,让res = 切线与x轴的交点,一直循环上面的操作直到前后两次的解相同为止。代码如下:
class Solution {
public:
int sqrt(int x) {
double res = 1.0, tmpres = 0.0;
while(int(res) - int(tmpres))
{
tmpres = res;
//res / 2.0 + x /(2.0 * res)为切线与x轴的交点
res = res / 2.0 + x /(2.0 * res);
}
return (int)res;
}
};