leetcode 69:x 的平方根
返回的是只保留整數的部分
二分查詢
該題是乙個很經典的二分查詢演算法。
def
mysqrt
(self, x:
int)
->
int:
left, right =
1, x
while left <= right:
mid = left + right >>
1# 取整,相當於 // 2,除以二取整。
temp = mid **
2if temp == x:
return mid
elif temp > x:
right = mid -
1else
: left = mid +
1return right
要注意幾個點:
想想為什麼返回值是right
而不是left
?
不用left
這一點,找幾個數演算一下就行了,它取得往往是向上取整,至於為什麼我也不太懂。
希望有懂的人指教一下。
擴充套件: 求 x 的平方根的準確值
def
mysqrt
(self, x:
int)
->
int:
left, right =
0, x
while right - left >1e-
6:# 計算精度,即退出條件
mid =
(left + right)/2
# 除法
temp = mid **
2if temp == x:
return mid
elif temp > x:
right = mid # 區間要連續變化
else
: left = mid
return right
牛頓法
牛頓迭代公式:
x n+
1=xn
−f(x
n)f′
(xn)
x_=x_-\frac\right)}\left(x_\right)}
xn+1=
xn−
f′(x
n)f
(xn
)就是通過多次求經過某一點的切線與橫座標的交點而得到的。
設 r本次求平方根就相當於求解 f(xrr 是 f(x
)=
0f(x)=0
f(x)=0
的根, 選取 x0x_
x0 作為 r
rr 的初始近似值, 過點 (x0
,f(x
0)
)\left(x_, f\left(x_\right)\right)
(x0,f
(x0
))做曲線 y=f
(x
)y=f(x)
y=f(x)
的切線 l
ll,l:y
=f(x
0)+f
′(x0
)(x−
x0),
l: y=f\left(x_\right)+f^\left(x_\right)\left(x-x_\right),
l:y=f(
x0)
+f′(
x0)
(x−x
0),
則 ll
l 與 x
xx 軸交點的橫座標 x1=
x0−f
(x0)
f′(x
0)
,x_=x_-\frac\right)}\left(x_\right)},
x1=x0
−f′
(x0
)f(x
0)
, 稱 x1x_
x1 為 r
rr
)=x2
−a
f(x)=x^-a
f(x)=x
2−a 的零點,將方程帶入上述公式,就可以得到求根的表示式:
x n+
1=xn
+a/x
n2
x_=\frac+a / x_}
xn+1=
2xn
+a/x
n
**如下:
# 牛頓法
defmysqrt
(self, x:
int)
->
int:
r = x
while r **
2- x >=1:
# 設定精度,r 最終退出時,其平方與準確值之間小於 1。然後取整數部分即可。
r =(r + x/r)/2
return
int(r)
內建函式(偷懶法)from math import sqrt
defmysqrt
(self, x:
int)
->
int:
return
int(sqrt(x)
)
x的平方根
題目三十九 實現int sqrt int x 函式,計算並返回 x 的平方根。您在真實的面試中是否遇到過這個題?yes 樣例sqrt 3 1 sqrt 4 2 sqrt 5 2 sqrt 10 3 挑戰 o log x class solution if i ix return i if i i x...
x的平方根
實現 int sqrt int x 函式。計算並返回 x 的平方根,其中 x 是非負整數。看到這個題,當時想到了利用二分法,查詢x的平方根。寫出了如下 public int mysqrt int x else if m m x m m 0 else return l 但是這個方法並不適用大數,因為m...
x的平方根
實現 int sqrt int x 函式。計算並返回 x 的平方根,其中 x 是非負整數。由於返回型別是整數,結果只保留整數的部分,小數部分將被捨去。示例 1 輸入 4 輸出 2 示例 2 輸入 8 輸出 2 說明 8 的平方根是 2.82842 由於返回型別是整數,小數部分將被捨去。袖珍計算器演算...