69. Sqrt(x)

69. Sqrt(x)

題目是要找出給定一個數字的平方根,如果沒有整數的平方根時,給出最接近的整數後,捨去所有的小數位(不用四捨五入)

題目存在著很簡單的解法,那就是從數字 1 開始,依序增加,每個數字都去計算出平方數,看是否等於題目給定的 x (或最接近)即可,這個方法的時間複雜度是線性的 \(O(n)\)。

但是這個題目存在著一個更快的方法,需要複習一點高中數學,那就是平方根一定小於或等於自身數字的一半,因此這樣就可以減去一半的搜尋空間。

接下來,搜尋的空間減少了一半,但是我們並不需要一個一個找,我們應該從這一半的集合中的中位數去找,當中位數的平方大於目標,那就代表平方根的答案會比中位數小,反之亦然,這個重複搜尋的邏輯,就可以轉換成二分搜索的方式,來找到答案。

class Solution:
    def mySqrt(self, x: int) -> int:        
        if x == 1:
            return 1
        left = 1
        right = x // 2
        while left <= right:
            mid = left + (right - left) // 2
            num = mid * mid
            if num == x:
                return mid
            elif num < x:
                left = mid + 1
            elif num > x:
                right = mid - 1
        return right