(python刷題)leetcode 第69題:x的平方根

題目描述:
在這裏插入圖片描述

解題思路:
求平方根的問題用牛頓法解題較好。牛頓法通過不斷迭代求得方程的近似解。要求sqrt(a),相當於求函數f(x)=x2-a的正根,牛頓法的思路是先隨便初始化一個點(xn,f(xn)),然後求函數在該點的切線與x軸的交點xn+1,則xn+1是比xn更加接近所求解的,依次迭代下去就可以得到近似解。下面用一張圖較爲直觀的進行說明:
在這裏插入圖片描述
圖像的曲線方程爲y=x2-a,爲了求它的正根sqrt(a),我們先隨便初始化曲線上的一個點A(xn,f(xn)),在A點做曲線的切線,切線與x軸的交點爲B(xn+1,0),從圖中可以看到xn+1比xn更接近所求的解,那麼繼續在B點做切線重複以上過程,就可以得到一個更接近的解,不斷迭代,直接得到的解在所需要的誤差範圍內即可找到所求的近似解。
下面推導迭代的公式:
在這裏插入圖片描述
得到的迭代公式就好辦了,牛頓法的解題步驟爲:

  1. 先對特殊情況進行判斷,當x=0時,直接返回0
  2. 題目給的x就是公式裏的a,初始化x0=x,x0的下一個迭代的值爲
    x1=(x0+x/x0)/2
  3. 判斷得到的x1是否在所需的誤差範圍內,這裏要返回整數,所以誤差爲1,即判斷abs(x1**2-x)是否小於1,如果是則返回int(x1)即可
  4. 如果不是,則繼續迭代下去,直到x1在誤差範圍才返回int(x1)

複雜度分析:
時間複雜度爲o(log(x))
空間複雜度爲o(1)

python代碼:

class Solution:
    def mySqrt(self, x: int) -> int:
        if x == 0:
            return x
        x0 = x
        x1 = (x0 + x / x0) / 2
        while abs(x1 ** 2 - x) >= 1:
            x0 = x1
            x1 = (x0 + x / x0) / 2
        return int(x1)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章