题目
题目描述
给你一个非负整数 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 的平方根的那个整数。
算法步骤
- 初始化边界:设定左右边界
left和right,其中left = 0,right = min(x, 46340)。 - 二分查找:
- 计算中间值
mid = (left + right) // 2。 - 如果
mid * mid == x,则直接返回mid。 - 如果
mid * mid < x,说明mid可能是结果之一,更新left = mid + 1。 - 如果
mid * mid > x,则更新right = mid - 1。
- 计算中间值
- 返回结果:循环结束后,
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 的平方根的那个整数
代码解释
- 初始化边界:根据题目提示,最大可能的
x是 (2^{31}-1),其平方根大约为 46340。因此,我们将right初始化为min(x, 46340),这样既可以处理大数值的情况,又可以防止乘法运算时发生整数溢出。 - 二分查找:通过不断调整
left和right的值,逐步缩小搜索范围,直到找到满足条件的最大整数mid,使得mid * mid <= x。 - 返回结果:最终返回
right,因为在最后一次迭代中,right会停留在最接近但不超过x的平方根的位置。
这种方法的时间复杂度为 O(log(min(x, 46340))),即对数级别的时间复杂度,非常高效。空间复杂度为 O(1),因为我们只使用了常数级别的额外空间。
提交结果

492

被折叠的 条评论
为什么被折叠?



