返回

LeetCode——#69 x 的平方根

IOS

1. 问题

给定一个非负整数 x,返回其平方根,保留小数点后六位小数。如果无法精确计算,则返回最接近的平方根。

2. 算法思路

解决该问题的经典算法是二分查找。具体步骤如下:

  1. 初始化搜索范围: 将搜索范围初始化为 [0, x]。
  2. 二分查找: 计算该范围中点 m = (left + right) / 2。
  3. 比较平方: 计算 m 的平方 m_squared = m * m。
  4. 判断误差: 如果 |m_squared - x| < epsilon,其中 epsilon 是我们允许的误差范围,则返回 m。
  5. 更新搜索范围: 如果 m_squared < x,则说明 m 太小,将 left 更新为 m。否则,将 right 更新为 m。
  6. 重复步骤 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 的平方根。通过代码实现和时间复杂度分析,我们深入理解了该算法的原理和效率。此外,通过精度控制,我们还可以根据需要调整算法的准确度。