QUESTION
easy
题目描述
实现 int sqrt(int x)
函数
计算并返回 x
的平方根,其中 x
是非负整数
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去
示例 1:
输入: 4
输出: 2
示例 2:
输入: 8
输出: 2
说明: 8 的平方根是 2.82842...
由于返回类型是整数,小数部分将被舍去
说明
无
SOLUTION
千万别告诉我,你从 1
开始一个一个算上去
方法一(二分搜索法)
见【Algorithm】二分查找法以及其变种,这是其中的第三类:查找最后一个不大于目标值的数(最后一个 <= 目标值)
class Solution {
public:
int mySqrt(int x) {
if(x <= 1) return x; // x is non-negative
int l = 0, r = x;
while(l <= r){
int mid = l + (r - l) / 2;
if(mid <= x / mid) l = mid + 1;
else r = mid - 1;
}
return r;
}
};
方法二(牛顿迭代法)
Wikipedia: https://en.wikipedia.org/wiki/Integer_square_root#Using_only_integer_division
求 x^2 = n
即求 x^2 - n = 0
的根,关于牛顿迭代法这里不详细解释了,总之下面的公式:
终止条件就是 x(k + 1)
与 x(k)
逼近到预先设定的阈值
class Solution {
public:
int mySqrt(int x) {
if (x == 0) return 0;
double res = 1, pre = 0;
while (abs(res - pre) > 1e-6) {
pre = res;
res = (res + x / res) / 2;
}
return int(res);
}
};
另外一种写法
class Solution {
public:
int mySqrt(int x) {
if(x <= 1) return x;
long res = x; // int will overflow
while(res > x / res){
res = (res + x / res) / 2;
}
return (int)res;
}
};