每天一更 Leecode每日一题--mySqrt

题目

在这里插入图片描述


解题

  • 方法一 牛顿法
  • 方法二
牛顿法

公式(1): x n + 1 = x n − f ( x n ) f ′ ( x n ) x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)} xn+1=xnf(xn)f(xn)
而这题官方给出的公式(2)是: x i + 1 = 1 2 ( x i + x x i ) x_{i+1} = \frac{1}{2}(x_i + \frac{x}{x_i}) xi+1=21(xi+xix)
为什么?

这题给的题目是求解平方根,其实相当于求解公式(3): f ( x ) = x 2 − a f(x)=x^2-a f(x)=x2a
f ( x ) = 0 f(x)=0 f(x)=0时, a a a就是方程的实数解
开始使用数学武器:
a. f ′ ( x ) = 2 x f'(x)=2x f(x)=2x,把 2 x 2x 2x带入到公式(1)里,得近似解公式(4): x − f ( x ) 2 x {x- \frac{f(x)}{2x}} x2xf(x)
b. 把公式(3)带入公式(4)里,得 x − ( x 2 − a ) 2 x {x- \frac{(x^2-a)}{2x}} x2x(x2a),化简得公式(5): 1 2 ( x + a x ) \frac{1}{2}(x + \frac{a}{x}) 21(x+xa)
所以官方给出了公式(2),其实牛顿法就是不断迭代的过程,先给一个不管多么离谱的近似解,然后带进公式,按照计算出的公式不断迭代,直到到达最接近的近似解,此时就是答案。

code:
官方解:

class Solution:
    def mySqrt(self, x: int) -> int:
        if x < 2:
            return x
        
        x0 = x
        x1 = (x0 + x / x0) / 2
        while abs(x0 - x1) >= 1:
            x0 = x1
            x1 = (x0 + x / x0) / 2
        return int(x1)

结果:
在这里插入图片描述更好的代码:

class Solution:
    def mySqrt(self, x):
        """
        :type x: int
        :rtype: int
        """
        if x <= 1:
            return x
        r = x
        while r > x / r:
            r = (r + x / r) // 2
        return int(r)

这个结果都挺好的
在这里插入图片描述

袖珍计算器算法

这是官方叫法,其实就是换个公式:
x = e 1 2 l o g x \sqrt{x} = e^{\frac{1}{2}logx} x =e21logx

code:

from math import e, log
class Solution:
    def mySqrt(self, x):
        if x <2:
            return x
        
        left = int(e ** (0.5 * log(x)))
        right = left + 1
        if  right * right > x:
            return left
        else:
            return right

要我说都import math 为啥不用sqrt

结果:
在这里插入图片描述速度还挺快…

3.10
over

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值