一、双指针法
双指针法的基本思想是,用两个指针分别指向0和x,然后不断逼近0的平方根。
def sqrt(x): if x == 0: return 0 l, r = 0, x while l <= r: mid = (l + r) // 2 if mid * mid == x: return mid elif mid * mid < x: l = mid + 1 else: r = mid - 1 return r
代码解释:
首先,判断输入的x是否为0,如果是则直接返回0。
然后,初始化两个指针l和r,分别指向0和x。
接着,在while循环中,不断计算mid(l和r的中间值),然后判断mid和x之间的关系。
如果mid的平方等于x,说明mid是x的平方根,直接返回mid。
如果mid的平方小于x,说明mid是一个过小的数,需要将l指向mid的右边一个数。
如果mid的平方大于x,说明mid是一个过大的数,需要将r指向mid的左边一个数。
最后,当l大于r时,循环结束,返回r,表示0的平方根。
二、牛顿迭代法
牛顿迭代法是一种不断逼近平方根的方法,在数学上也有较为广泛的应用。
def sqrt(x): if x == 0: return 0 res = x while res * res > x: res = (res + x // res) // 2 return res
代码解释:
首先,判断输入的x是否为0,如果是则直接返回0。
然后,初始化res为x。
在while循环中,不断计算res的平方,与x进行比较。
如果res的平方大于x,说明res是一个过大的数,需要使用牛顿迭代法进行逼近。
在牛顿迭代法中,每次使用res和x/res的平均值来更新res。
最后,当res的平方不再大于x时,循环结束,返回res即可。
三、二分查找法
二分查找法是一种基于有序数组查找指定元素的算法,可以用于求解0的平方根。
def sqrt(x): if x == 0: return 0 left, right = 1, x while left <= right: mid = (left + right) // 2 if mid * mid > x: right = mid - 1 elif (mid+1) * (mid+1) <= x: left = mid + 1 else: return mid return 0
代码解释:
首先,判断输入的x是否为0,如果是则直接返回0。
然后,初始化left为1,right为x。
在while循环中,不断计算mid(left和right的中间值),然后判断mid的平方与x之间的关系。
如果mid的平方大于x,说明mid是一个过大的数,需要将right指向mid的左边一个数。
如果(mid+1)的平方小于等于x,说明(mid+1)是最接近0的平方根的一个数,需要将left指向mid的右边一个数。
最后,当没有找到最接近0的平方根的数时,循环结束,返回0。