leetcode: sqrtx [x 的平方根] 二分法、遞歸法

'''
計算並返回 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上提交結果:
在這裏插入圖片描述


搜索到另一種方法,通過推理髮現規律,然後使用遞歸法:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-4HGByRTq-1591458667126)(../../../markdown_pic/blog_sqrt.png)]
可以看出,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 …)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章