【LeetCode】69. x 的平方根
基于二分查找的算术平方根整数解实现
要计算非负整数 x 的算术平方根整数部分,核心思路是找到最大的整数 n 满足 n² ≤ x。以下是分步骤实现及解析:
算法思路
- 边界初始化
- 左边界
left = 0,右边界right = x。
- 左边界
- 二分查找
- 计算中间值
mid = (left + right) / 2。 - 比较
mid²与x:- 若
mid² == x→ 直接返回mid。 - 若
mid² < x→ 说明结果可能在右半区间,调整左边界left = mid + 1。 - 若
mid² > x→ 说明结果可能在左半区间,调整右边界right = mid - 1。
- 若
- 计算中间值
- 终止条件
- 当
left > right时,循环结束,此时right是满足right² ≤ x的最大整数。
- 当
Golang代码实现
func mySqrt(x int) int { if x <= 1 { return x // 直接处理0和1的边界情况 } left, right := 0, x for left <= right { mid := left + (right-left)/2 // 避免整数溢出 square := mid * mid if square == x { return mid } else if square < x { left = mid + 1 } else { right = mid - 1 } } return right // 最终right是最大整数解 }
代码解析
- 边界处理
x == 0或x == 1时直接返回x,因为它们的算术平方根就是自身。
- 二分查找优化
- 使用
mid := left + (right-left)/2代替(left+right)/2,防止大数相加时溢出。
- 使用
- 比较逻辑
- 通过
mid²与x的比较动态调整区间,最终定位到满足条件的最右侧整数。
- 通过
复杂度分析
| 指标 | 值 | 说明 |
|---|---|---|
| 时间复杂度 | O(log x) | 二分查找每次将范围减半 |
| 空间复杂度 | O(1) | 仅需常数空间 |
示例验证
-
示例1:
x = 4
中间值mid=2,2²=4直接返回结果2。 -
示例2:
x = 8
循环中mid=2时2²=4 < 8,调整左边界为3;最终right=2,返回2。
关键点总结
- 算法选择:二分查找是解决此类问题的经典方法,效率远高于暴力遍历。
- 溢出处理:通过调整中间值计算方式避免大数相加溢出。
- 结果定位:循环结束时
right始终指向最大的合法整数解。
该方法完全满足题目要求,且能高效处理大数值输入。

浙公网安备 33010602011771号