返回
LeetCode——#69 x 的平方根
IOS
2023-12-31 10:24:15
1. 问题
给定一个非负整数 x,返回其平方根,保留小数点后六位小数。如果无法精确计算,则返回最接近的平方根。
2. 算法思路
解决该问题的经典算法是二分查找。具体步骤如下:
- 初始化搜索范围: 将搜索范围初始化为 [0, x]。
- 二分查找: 计算该范围中点 m = (left + right) / 2。
- 比较平方: 计算 m 的平方 m_squared = m * m。
- 判断误差: 如果 |m_squared - x| < epsilon,其中 epsilon 是我们允许的误差范围,则返回 m。
- 更新搜索范围: 如果 m_squared < x,则说明 m 太小,将 left 更新为 m。否则,将 right 更新为 m。
- 重复步骤 2-5, 直到搜索范围收敛或达到最大迭代次数。
3. 代码实现
func mySqrt(_ x: Int) -> Double {
// 初始化搜索范围
var left = 0
var right = x
// 二分查找
while left <= right {
// 计算中点
let mid = (left + right) / 2
// 计算中点的平方
let midSquared = Double(mid) * Double(mid)
// 比较平方
if abs(midSquared - Double(x)) < epsilon {
return Double(mid)
} else if midSquared < Double(x) {
left = mid + 1
} else {
right = mid - 1
}
}
// 未找到精确平方根,返回最接近的值
return Double(left - 1)
}
4. 时间复杂度
该算法的时间复杂度为 O(log x),其中 x 是给定的整数。这是因为二分查找将搜索范围减半,每一步都将搜索范围缩小一半。
5. 精度控制
通过调整 epsilon 的值,我们可以控制算法的精度。较小的 epsilon 值将导致更精确的结果,但也会增加计算时间。对于本问题,我们选择 epsilon 为 1e-6,可以提供六位小数的精度。
6. 结论
本篇文章详细介绍了如何使用二分查找算法求解 LeetCode 第 69 题——x 的平方根。通过代码实现和时间复杂度分析,我们深入理解了该算法的原理和效率。此外,通过精度控制,我们还可以根据需要调整算法的准确度。