'''
計算並返回 x 的平方根,其中 x 是非負整數。
由於返回類型是整數,結果只保留整數的部分,小數部分將被捨去。
示例 1:
輸入: 4
輸出: 2
示例 2:
輸入: 8
輸出: 2
說明: 8 的平方根是 2.82842...,
由於返回類型是整數,小數部分將被捨去。
'''
看到這個題目,好像沒啥思路,然後去 Google 了一下求平方根的算法:
For a natural number x (i.e. x ∈ {0,1,2,3,...}),
the integer square root of x is defined as the natural number r such that r**2 ≤ x < (r + 1)**2.
It is the greatest r such that r**2 ≤ x, or equivalently, the least r such that (r + 1)**2 > x.
我第一想到的是用 二分法 來實現,我的解法:
# Python3
class Solution:
def average(self, x, y):
return (x + y) / 2
def mySqrt(self, x: int) -> int:
smaller, bigger = 1, x
middle = self.average(smaller, bigger)
while True:
if middle ** 2 > x:
bigger = middle
middle = self.average(smaller, middle)
else:
smaller = middle
middle = self.average(middle, bigger)
if x <= middle ** 2 < x + 1:
break
return middle // 1
if __name__ == '__main__':
s = Solution()
assert s.mySqrt(1) == 1
assert s.mySqrt(4) == 2
assert s.mySqrt(8) == 2
assert s.mySqrt(9) == 3
在leetcode上提交結果:
搜索到另一種方法,通過推理髮現規律,然後使用遞歸法:
可以看出,x 的平方根和 x-1 的平方根有關係,有時候它們相同,有時候後者比前者多1。因此,可以寫一個遞歸算法。(不過此算法在leetcode上提交後超時了)
# Python3
class Solution:
def mySqrt(self, x):
if x == 0:
return 0
else:
r2 = self.mySqrt(x - 1)
r3 = r2 + 1
if x < r3 ** 2:
return r2
else:
return r3
還有其他更優的方法,能力有限,看不懂了,畢竟是 Cornell University 的網站上的。
Reference (需要能使用Google才能訪問,so …)