1.题目描述
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
2.示例
示例 1:
输入:x = 4
输出:2
示例 2:
输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
提示:
0 <= x <= 231 - 1
3.题解
3.1 遍历查找
最开始的想法就是从0到x之间的每一个数字都代入进去进行计算,判断是否为x的平方根,若是则返回
class Solution:
def mySqrt(self, x: int) -> int:
if x == 0:
return 0
for i in range(x+1):
if i*i == x:
return i
if i*i < x and (i+1) * (i+1) > x:
return i
result:
3.2 缩短遍历范围进行查找
这个办法是在之前遍历查找的基础上做了一些改进,排除了0和1这2个平方根为本身的特殊数字。然后将遍历范围从[0,x]缩短至[0, x//2]或[0, x//2+1]。从而减少时长
class Solution:
def mySqrt(self, x: int) -> int:
if x == 0:
return 0
if x == 1:
return 1
m = x if x % 2 ==0 else x+1
for i in range(m//2+1):
if i*i == x:
return i
if i*i < x and (i+1) * (i+1) > x:
return i
result:
3.3 二分查找
这个是在前面3.2的缩短一侧的基础上,从两侧进行范围缩小。
class Solution:
def mySqrt(self, x: int) -> int:
start, end = 0, x
while start < end:
mid = (start + end + 1) >> 1
if mid * mid <= x:
start = mid
else:
end = mid - 1
return star
result: