算法学习:LeetCode-69. x 的平方根

1.题目

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。

由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。

注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/sqrtx

2.解题思路

法一:归纳定限法

2*2=4, 2<=\frac{4}{2}

3*3=9,3<=\frac{9}{2}

4*4=16,4<=\frac{16}{2}

.....

则k*k=x时,有k<=\frac{x}{2}

所以我们可以通过遍历得到最接近x的算术平方根的值。

法二:二分法

        经典二分查找的变种,判断条件该为平方是否小于等于x。

法三:牛顿插值

        用 K 表示待求出平方根的那个整数,K 的平方根就是函数:

f(x)=x^2-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/

你可能感兴趣的:(LeetCode,leetcode,算法,职场和发展)