Leetcode 69:Sqrt(x)(超詳細的解法!!!)
阿新 • • 發佈:2018-12-12
實現 int sqrt(int x)
函式。
計算並返回 x 的平方根,其中 x 是非負整數。
由於返回型別是整數,結果只保留整數的部分,小數部分將被捨去。
示例 1:
輸入: 4
輸出: 2
示例 2:
輸入: 8
輸出: 2
說明: 8 的平方根是 2.82842...,
由於返回型別是整數,小數部分將被捨去。
解題思路
首先可以想到的最簡單的處理思路就是遍歷[1,x]
的所有元素i
,計算相應的平方值,如果大於x
的話,我們返回i-1
即可。
class Solution:
def mySqrt(self, x):
"""
:type x: int
:rtype: int
"""
for i in range(x+1):
if i**2 > x:
return i - 1
return x
但是這顯然太過隨意,時間複雜度太高。這個問題在數學上已經有很明確的解法了,就是大名鼎鼎的牛頓法。
首先,選擇一個接近函式 零點的 ,計算相應的 和切線斜率 (這裡 表示函式 的導數)。然後我們計算穿過點 並且斜率為 的直線和 軸的交點 座標,也就是求如下方程的解:
我們將新求得的點的 座標名為 ,通常 會比 更接近方程 的解。因此我們現在利用 開始下一輪迭代。迭代公式可以簡化為下面表示:
對於本題我們要求解的就是 的解,也就是 ,對應的 。
class Solution:
def mySqrt(self, x):
"""
:type x: int
:rtype: int
"""
res = x
while res**2 > x:
res = (res + x//res)//2
return res
reference:
https://zh.wikipedia.org/wiki/牛頓法
我將該問題的其他語言版本新增到了我的GitHub Leetcode
如有問題,希望大家指出!!!