Sqrt(x)

题目链接

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。

由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。

注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

示例:

输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。

思路

解法一:

使用二分法求解,由于非负整数 x(当 x ≠ 0 时) 的平方根一定是落在区间 [1, x//2 + 1]

难点在于若找不到一个数的平方等于目标值,则需要向下取整,那到底是取左边界还是右边界呢?

二分查找的终止条件是 left > right,最终找到的结果一定是 right < final_value < left 同理可知,若是向上取整则为left

class Solution:
    def mySqrt(self, x: int) -> int:
        left, right = 1,  x // 2 + 1
        while left <= right:
            mid = left + (right - left) // 2
            if mid * mid < x: 
                left = mid + 1
            elif mid * mid > x:
                right = mid - 1
            else:
                return mid
        return right # 取右边界,向下取整