给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
看到该题想到曾经做过的有效的完全平方数的题目,类似地,可以先使用暴力解法。由题目有,最后返回的i满足i*i <= x < (i+1)*(i+1),所以终止循环可以使用左边界,因为有自加操作,最后返回结果需要减1。
class Solution:
def mySqrt(self, x: int) -> int:
if not x:return x
i = 1
while i*i <= x :
i += 1
return i -1
时间复杂度 O(),空间复杂度O(1)
类似地,边界问题可以使用二分查找。
class Solution:
def mySqrt(self, x: int) -> int:
l,r = 0, x
ans = -1
while l <= r:
m = (l+r)//2
if m * m > x:
r = m - 1
else:
ans = m
l = m + 1
return ans
时间复杂度O(logx),空间复杂度O(1)