1.题目
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/sqrtx
2.解题思路
法一:归纳定限法
2*2=4,
3*3=9,
4*4=16,
.....
则k*k=x时,有
所以我们可以通过遍历得到最接近x的算术平方根的值。
法二:二分法
经典二分查找的变种,判断条件该为平方是否小于等于x。
法三:牛顿插值
用 K 表示待求出平方根的那个整数,K 的平方根就是函数:
确定初始值后,每次计算一个新的交点横坐标,带进去不断进行迭代,当判断相邻两次迭代的结果的差值是否小于一个极小的非负数 ,就可以结束迭代了。
3.代码
//法一
class Solution {
public:
int mySqrt(int x) {
int n=x/2;
if(x==1){
return 1;
}
for(long i=1;i<=n;i++){
if(i*i<=x && (i+1)*(i+1)>x){
return i;
}
}
return 0;
}
};
//法三
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);
}
};
作者:LeetCode-Solution
链接:https://leetcode.cn/problems/sqrtx/solution/x-de-ping-fang-gen-by-leetcode-solution/