1. 二分查找算法与平方根计算的关系
第一次接触二分查找算法时,我完全没想到这个看似简单的思想能用来计算平方根。直到有一天,我在解决LeetCode第69题"x的平方根"时,才真正体会到二分查找在数值计算中的精妙之处。
计算一个非负整数x的平方根(只保留整数部分)这个问题,最直观的解法可能是从0开始逐个尝试,直到找到最大的整数i满足i² ≤ x。但这种方法的时间复杂度是O(√x),当x很大时效率极低。而二分查找可以将时间复杂度降到O(logx),效率提升显著。
二分查找之所以适用于平方根计算,是因为:
- 平方根函数在定义域内是单调递增的
- 我们可以将问题转化为在有序区间[0, x]中查找满足条件的最大整数
- 每次迭代都能将搜索范围减半,快速逼近解
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 二分查找求平方根的基本实现
2.1 算法框架设计
实现二分查找求平方根的基本框架如下:
python复制def mySqrt(x):
if x < 2:
return x
left, right = 0, x
while left <= right:
mid = left + (right - left) // 2
if mid * mid == x:
return mid
elif mid * mid < x:
left = mid + 1
else:
right = mid - 1
return right
这个实现有几个关键点需要注意:
- 边界条件处理:当x为0或1时直接返回x
- 中间值计算:使用
left + (right - left) // 2而非(left + right) // 2防止整数溢出 - 循环终止条件:
left <= right确保能处理所有情况 - 返回值:最终返回right而非left,因为我们要找的是不超过x的最大整数平方根
2.2 算法正确性分析
让我们以x=8为例,逐步分析算法的执行过程:
初始状态:left=0, right=8
- mid=4, 4²=16>8 → right=3
- mid=1, 1²=1<8 → left=2
- mid=2, 2²=4<8 → left=3
- mid=3, 3²=9>8 → right=2
循环终止,返回right=2
确实,2是8的整数平方根,因为2²=4≤8且3²=9>8。
2.3 时间复杂度与空间复杂度
时间复杂度:O(logx)
- 每次迭代将搜索范围减半,最多需要log₂x次迭代
空间复杂度:O(1)
- 只使用了固定数量的变量,与输入规模无关
3. 算法优化与边界条件处理
3.1 初始右边界优化
观察到一个数的平方根不会超过它的一半(x≥4时),我们可以将初始右边界设为x//2 + 1:
python复制def mySqrt(x):
if x < 2:
return x
left, right = 2, x // 2
while left <= right:
mid = left + (right - left) // 2
if mid * mi
