69.x的平方根
描述
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例1
输入: 4
输出: 2
示例2
输入: 8
输出: 2
说明: 8 的平方根是 2.82842…, 由于返回类型是整数,小数部分将被舍去。
我第一想法简单粗暴但超出时间限制。
if x == 0:
return 0
elif x < 0:
return 'error'
else:
i = 1
while True:
if (i+1)**2 > x >= i**2:
return i
i+=1
改进一下,因为结果肯定是有序的从1,2,3.。。查找,所以使用二分查找。
if x == 1:
return 1
l = 1
h = x//2
while h > l:
m = (l+h)//2
if m**2 > x:
h = m-1
elif m**2 < x:
l = m+1
else:
return m
if h == l:
if (h-1)**2 < x < h**2:
return h-1
else:
return h
elif h < l:
return h
这里比二分查找麻烦的是需要考虑,当结果不在查找的序列是按下取整。这下终于通过了,但是运行时间却是吊车尾。看看别人的,也是用的二分查找,不过是在我的第一版基础上改了一下,不像我这么笨笨地机械套用二分查找。
if x == 0:
return 0
l = 1
r = x
while l <= x:
res = (l + r) // 2
s = res**2
if s <= x < (res + 1)**2:
return res
if s < x:
l = res
if s > x:
r = res
这个问题关键在于结果的下取整。所以我的代码在判断x与m平方的时候可以进行优化。(m-1)**2 <= x < m**2.