题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sqrtx
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入: 4
输出: 2
示例 2:
输入: 8
输出: 2
说明: 8 的平方根是 2.82842…,
由于返回类型是整数,小数部分将被舍去。
解决这个问题有三种方法。
- 暴力法,n从1开始遍历到x,如果n2≤x且n2>x,那么此时的n就符合要求了
- 牛顿迭代法:Java实现开平方的牛顿迭代法. 求 的算术平方根就是求 ==f(x) = x2 - c ==的正根, 得迭代公式:xn+1 = 1/2(xn + c/xn) . 代码中取初始值 c, 误差控制在 1x10-15.
public static int mysqrt(int x) {
if (x == 0){
return 0;
}
double e = 1e-15;
double c = x, x0 = x;
double y = (x0 + c / x0) / 2;
while (Math.abs(x0 - y) > e) {
x0 = y;
y = (x + c / x) / 2;
}
return (int)x0;
}
3.二分查找,由于x平方根的整数部分满足n2≤x的最大值,因此可以对n进行二分查找
public int mySqrt(int x) {
if (x == 0){
return 0;
}
int l = 0, r = x;
int rs = -1;
while (l <= r){
int mid = l + (r - l) / 2;
if ((long)mid * mid <= x){
rs = mid;
l = mid + 1;
} else {
r = mid - 1;
}
}
return rs;
}