给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
示例 1:
输入:x = 4
输出:2
示例 2:
输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
思路
- 阅读完题目很快就能看出来这个题和搜索插入位置的题是类似的,而且x的平方根一定存在与[0, (x+1) // 2]
- 如果是x的平方根是整数的话,会返回middle,若不是最后right或者right - 1
解题
class Solution(object):
def mySqrt(self, x):
left = 0
right = (x + 1) // 2
while left <= right:
middle = (left + right) // 2
tmp = middle * middle
if tmp < x:
left = middle + 1
elif tmp > x:
right = middle - 1
else:
return middle
if right * right > x:
return right - 1
return right