【LeetCode 简单题】14- x 的平方根

声明:

今天是第14道题。实现 int sqrt(int x) 函数,计算并返回 x 的平方根,其中 是非负整数,由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。以下所有代码经过楼主验证都能在LeetCode上执行成功,代码也是借鉴别人的,在文末会附上参考的博客链接,如果侵犯了博主的相关权益,请联系我删除

(手动比心ღ( ´・ᴗ・` ))

正文

题目:实现 int sqrt(int x) 函数,计算并返回 x 的平方根,其中 是非负整数,由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。

示例 1:

输入: 4
输出: 2

示例 2:

输入: 8
输出: 2
说明: 8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。

解法1。常规的二分法,不断逼近最接近sqrt(x)的值

class Solution:
    def mySqrt(self, x):
        """
        :type x: int
        :rtype: int
        """
        # V 1.0,能提交
        left = 0
        right = x
        mid = x//2 # 注意这里是向下取整,应题目要求舍去小数部分
        while left <= right:
            mid_2 = pow(mid,2)
            if mid_2 < x:
                left = mid + 1
            elif mid_2 > x:
                right = mid - 1
            else:
                return mid
            mid = (left+right)//2  # 注意这里mid的更新写在最后,也就是left和right更新之后,而不是之前
        return mid

解法2。牛顿-拉弗森法用来算平方根:设某数为p,则有方程f(x)=x^{2}-a,方程的0根即为所求数的平方根。用牛顿-拉弗森方法解非线性方程f(x)=0的牛顿法是把非线性方程线性化的一种近似方法。把f(x)x_{0}点附近展开成泰勒级数f(x)=f(x_{0})+{f}'(x_{0})(x-x_{0})+({f}''(x_{0})/2!)(x-x_{0})^{2}+... 取其线性部分,作为非线性方程f(x)=0的近似方程,即泰勒展开的前两项,则有f(x)=f(x_{0})+{f}'(x_{0})(x-x_{0})=0,设{f}'(x)\neq 0则其解为x_{1}=x_{0}-f(x_{0})/{f}'(x_{0})这样,得到牛顿法的一个迭代序列:x_{n+1}=x_{n}-f(x_{n})/{f}'(x_{n}),再代入f(x)=x^{2}-a,得到y的迭代公式:y_{n+1} = (x_{n}+a/x_{n})/2,然后就可以比较迭代出的值和目标值a的差是否满足精度范围。

class Solution:
    def mySqrt(self, x):
        k=1
        while(abs(k**2-x)<1e-4):
            k = (k+x/k)/2  # y值的迭代公式
        return k

结尾

解法1:https://blog.csdn.net/weixin_41958153/article/details/81448615

解法2:https://blog.csdn.net/dawnbreak/article/details/3308413

猜你喜欢

转载自blog.csdn.net/weixin_41011942/article/details/82696908
今日推荐