二分查找
题目
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
方法一
白痴本人想出来的傻方法
无脑循环从1到x/2循环
class Solution:
def mySqrt(self, x: int) -> int:
if x==1:
return 1
if x==0:
return 0
for i in range(1,int(x/2)+1):
if i*i>x:
return i-1
return i
方法二
将根号利用其它函数实现
class Solution:
def mySqrt(self, x: int) -> int:
if x==0:
return 0
num=exp(0.5*log(x))
num=int(num)
#指数运算会存在误差,因为计算机无法存储浮点数,当 x = 2147395600正确结果是46340,而指数运算结果会是46339
#int()会向下取整,所以下一步要判断
return num+1 if (num+1)*(num+1)<=x else num
方法三:二分查找
class Solution:
def mySqrt(self, x: int) -> int:
l=0
r=x
n=0
while l<=r :
m=int(l+(r-l)/2)
if m*m<=x:
#如果中间值平方小于x,说明真实值在下半部分区间
n=m#直接用n=m可以得到结果就不用判断
l=m+1
else:
r=m-1
return n
实际这个方法运行最快。而不是牛顿迭代哎
方法四:牛顿迭代
牛顿怎么什么都能做
从x开始每次向求解值更新靠近,直到两次的更新值之间相差小于1e-7
class Solxiangution:
def mySqrt(self, x: int) -> int:
if x==0:
return 0
xi=x
while True:
xii=0.5*(xi+x/xi)
if fabs(xii-xi)<1e-7:
break
xi=xii
return int(xii)