今天是紀錄LeetCode解題的第六十九天
第六十九題題目:Given a non-negative integer x, return the square root of x rounded down to the nearest integer. The returned integer should be non-negative as well.
You must not use any built-in exponent function or operator.
pow(x, 0.5) in c++ or x ** 0.5 in python.給定一個非負整數x,傳回其向下取整到最接近的整數的平方根,不能使用任何內建的指數函數或運算符
pow(x, 0.5)或在python中使用x ** 0.5
暴力法
要找出平方根,只要遍歷i = 1 ~ x // 2 + 2(+2是要找0跟1的平方根的時候,讓迴圈可以跑)的範圍就好,當i * i == x則直接回傳i,i * i > x回傳i - 1
二分搜尋
先排除0和1的平方根情況,遇到x < 2都直接回傳x
我們知道平方根的範圍落在1 ~ x // 2,令left = 1、right = x // 2,算出他的中間值mid,當mid * mid == x直接回傳mid,如果小於x,則將left = mid + 1,反之right = mid - 1,最後回傳right
牛頓法
先排除0和1的平方根情況,遇到x < 2都直接回傳x

暴力法
class Solution:
def mySqrt(self, x: int) -> int:
for i in range(1,x // 2 + 2):
if i * i > x:
return i - 1
elif i * i == x:
return i
二分搜尋
class Solution:
def mySqrt(self, x: int) -> int:
if x < 2:
return x
l, r = 1, x // 2
while l <= r:
mid = (l + r) // 2
if mid * mid == x:
return mid
elif mid * mid < x:
l = mid + 1
else:
r = mid - 1
return r
牛頓法
class Solution:
def mySqrt(self, x: int) -> int:
if x < 2:
return x
r = x
while r * r > x:
r = (r + x // r) // 2
return r
暴力法
i = 1
i = 2
i = 3
二分搜尋
牛頓法
牛頓法在x非常大的時候會比暴力法跟二分搜尋法還要來的快非常多,因為牛頓法是二次收斂,誤差平方級的減少,也就是說每次迭代誤差會變成上次誤差的平方,所以會非常快地找到我們要求的值