直接回答:两种常用做法:二分查找和牛顿迭代。二分在 [0, x] 区间逼近,mid² 与 x 比较后收缩区间;牛顿迭代利用切线逼近,递推式 r = (r + x / r) / 2,从任意正初值出发二次收敛,通常几次迭代即达精度。

展开解析:牛顿法本质是求 f(r) = r² − x 的零点,迭代式来自 r ← r − f(r)/f′(r)。它的收敛速度是平方级(正确位数每轮翻倍),实践中比二分快,但要求初值为正且要处理 x < 1 时 x/r 的浮点行为;整数版本(LeetCode 式,返回 floor(√x))常用二分,注意用 mid <= x / mid 代替 mid * mid <= x 避免溢出,以及右边界收缩时 +1/−1 的边界条件。追问方向:牛顿法初值选择对收敛的影响、IEEE754 浮点位操作快速倒数平方根(Quake 魔数 0x5f3759df 的思路)、二分答案思想在其他单调判定问题上的推广。

示例

def my_sqrt(x: int) -> int:
    lo, hi, ans = 0, x, 0
    while lo <= hi:
        mid = (lo + hi) // 2
        if mid <= x // mid:      # 等价 mid*mid <= x,防溢出
            ans, lo = mid, mid + 1
        else:
            hi = mid - 1
    return ans