69.x的平方根 python

题目

题目描述

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。

由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。

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

示例 1:

输入:x = 4
输出:2

示例 2:

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

提示:

0 <= x <= 2 31 2^{31} 231 - 1

题解

思路分析

为了求解这个问题,可以采用二分查找(Binary Search)的方法。这是因为对于任意非负整数 x,其平方根必定位于 [0, x] 范围内(当 x >= 1 时),或者更精确地说,位于 [0, min(x, 46340)](因为 ( \sqrt{2^{31}-1} \approx 46340 ))。我们可以通过不断缩小搜索范围来高效地找到最接近但不超过 x 的平方根的那个整数。

算法步骤

  1. 初始化边界:设定左右边界 leftright,其中 left = 0right = min(x, 46340)
  2. 二分查找
    • 计算中间值 mid = (left + right) // 2
    • 如果 mid * mid == x,则直接返回 mid
    • 如果 mid * mid < x,说明 mid 可能是结果之一,更新 left = mid + 1
    • 如果 mid * mid > x,则更新 right = mid - 1
  3. 返回结果:循环结束后,right 将是最接近但不超过 x 的平方根的那个整数。

Python 实现代码

def mySqrt(x: int) -> int:
    if x == 0:
        return 0
    
    left, right = 1, min(x, 46340)  # 设置合理的右边界以避免溢出
    
    while left <= right:
        mid = (left + right) // 2
        square = mid * mid
        
        if square == x:
            return mid
        elif square < x:
            left = mid + 1
        else:
            right = mid - 1
    
    return right  # 返回最接近但不超过 x 的平方根的那个整数

代码解释

  1. 初始化边界:根据题目提示,最大可能的 x 是 (2^{31}-1),其平方根大约为 46340。因此,我们将 right 初始化为 min(x, 46340),这样既可以处理大数值的情况,又可以防止乘法运算时发生整数溢出。
  2. 二分查找:通过不断调整 leftright 的值,逐步缩小搜索范围,直到找到满足条件的最大整数 mid,使得 mid * mid <= x
  3. 返回结果:最终返回 right,因为在最后一次迭代中,right 会停留在最接近但不超过 x 的平方根的位置。

这种方法的时间复杂度为 O(log(min(x, 46340))),即对数级别的时间复杂度,非常高效。空间复杂度为 O(1),因为我们只使用了常数级别的额外空间。

提交结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gxls2024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值