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 # 取右边界,向下取整