【LeetCode】69. x的平方根

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bqw18744018044/article/details/89018692
  • 题目描述

计算并返回x的平方根,其中x是非负整数。由于返回类型是整数,结果只保留整数部分,小数部分将被舍去。

  • 思路

  1. 方法一

    由于sqrt(x)的值不会超过x/2+1,因此可以在这个范围内进行二分搜索。

  2. 方法二

    使用牛顿迭代法求解。假设我们希望求得\sqrt{a}的值,相当于求解方程。那么就可以使用牛顿迭代法来逐步逼近这个解。

    首先,任选一个点,在该点对进行泰勒展开,得到

    其中可以看做是对的线性近似,令得到的0点要比更加接近的解。因此令

    化简得

    代入上式得到

    因此迭代的下一个位置

 

  • C++实现

  1. 方法一
    int mySqrt(int x){
            long long l = 0;
            long long h = x/2 + 1;
            while(l<=h){
                long long mid = (l+h)/2;
                long long sq = mid*mid;
                if(sq==x)return mid;
                else if(sq<x)l = mid+1;
                else h = mid - 1;
            }
            return h;
        }
    
  2. 方法二
int mySqrt(int x){
        if(x<=1)return x;
        int r = x>>1;
        //当r*r>x时,说明还没有得到解(这里用r>x/r是为了防止计算r*r溢出)
        while(r>x/r){
            r = (r+x/r)>>1;
        }
        return r;
    }

猜你喜欢

转载自blog.csdn.net/bqw18744018044/article/details/89018692