灵感来源
-保持更新,努力学习
-python脚本学习
x的平方根
解题思路
1.确定范围:平方根取值范围为 [0,x] (x≥0)。
2.二分查找:在范围内找最大整数 mid 使得 mid²≤x。
3.处理溢出:计算时用 long 避免整数溢出。
class Solution:
def mySqrt(self, x: int) -> int:
if x == 0:
return 0
left, right = 1, x
res = 0
while left <= right:
mid = left + (right - left) // 2
square = mid * mid
if square == x:
return mid
elif square < x:
res = mid
left = mid + 1
else:
right = mid - 1
return res
逐行解释
class Solution:
def mySqrt(self, x: int) -> int:
# 处理特殊情况:当 x 为 0 时,平方根直接为 0
if x == 0:
return 0
# 初始化二分查找的左右边界:左边界从 1 开始(0 的情况已处理),右边界为 x 本身
left, right = 1, x
# 初始化结果变量,用于记录符合条件的最大整数解
res = 0
# 二分查找循环:当左边界小于等于右边界时,继续查找
while left <= right:
# 计算中间值,使用 (left + right) // 2 防止整数溢出(Python 中溢出处理较灵活,但习惯写法)
mid = left + (right - left) // 2
# 计算中间值的平方(可能会较大,但 Python 自动处理大整数,此处无需转类型)
square = mid * mid
# 判断平方是否等于 x:若相等,直接返回中间值作为精确解
if square == x:
return mid
# 若平方小于 x:说明中间值可能是解的候选,更新结果为 mid,并向右半区查找更大的可能解
elif square < x:
res = mid # 记录当前可能的最大解
left = mid + 1 # 调整左边界,搜索区间变为 [mid+1, right]
# 若平方大于 x:说明中间值过大,向左半区查找更小的解
else:
right = mid - 1 # 调整右边界,搜索区间变为 [left, mid-1]
# 循环结束后,res 即为满足 mid² ≤ x 的最大整数解
return res