美文网首页
力扣(LeetCode)之x的平方根

力扣(LeetCode)之x的平方根

作者: 小黄不头秃 | 来源:发表于2023-09-07 00:22 被阅读0次
题目:

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。

注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

示例:

输入:x = 4
输出:2

输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
方法一:暴力搜索法

就是从0开始到x,一个一个去寻找。其具体代码如下:

# 暴力算法
def fun1(x):
    if x == 0 or x == 1:
        return x
    for i in range(x+1):
        if i*i > x:
            return i-1 
方法二:二分法

二分法是暴力算法的改进版本,我们需要左右或者开始(start)和结束(end)两个指针,表示我们要搜索的区间[start, end]。首先我们计算这两个指针的中间值(mid)。如果中间值的平方大于x,就说明x的平方根会比mid小,那么,我们的查找区间就变成了[start, mid],我们将原来的end = mid,这样我们每一次都能够排除一半的搜索空间,这样的方法就叫做二分法,最后我们能迅速找到最后的答案。

# 二分法
def fun2(x):
    start, end = 0, x 
    index = -1 

    while start <= end:
        mid = int(start + (end - start)/2)
        if mid * mid <= x:
            index = mid
            start = mid + 1 
        else:
            end = mid - 1 
    return index 
方法三:牛顿迭代法

牛顿迭代法使用的是递归函数,假如x=12,我们将12进行因数分解12 = 2 * 6,我们会发现2和6这两个解都不接近x的平方根,但是2和6的平均数较为接近x的平方根,我们只需要不断重复这个操作,我们最终就能够找到x的平方根。下面是具体实现代码:

# 牛顿迭代(递归方法)
def fun3(x, i=1):# 第2个参数可以取值1-x
    if x == 0: return 0
    res = (i + x/i)/2 
    if res == i: return int(i) 
    else: return fun3(x, res)

相关文章

网友评论

      本文标题:力扣(LeetCode)之x的平方根

      本文链接:https://www.haomeiwen.com/subject/jeanmdtx.html