【LeetCode】69. x 的平方根

leetcode

 

基于二分查找的算术平方根整数解实现

要计算非负整数 x 的算术平方根整数部分,核心思路是找到最大的整数 n 满足 n² ≤ x。以下是分步骤实现及解析:


算法思路

  1. 边界初始化
    • 左边界 left = 0,右边界 right = x
  2. 二分查找
    • 计算中间值 mid = (left + right) / 2
    • 比较 mid² 与 x
      • 若 mid² == x → 直接返回 mid
      • 若 mid² < x → 说明结果可能在右半区间,调整左边界 left = mid + 1
      • 若 mid² > x → 说明结果可能在左半区间,调整右边界 right = mid - 1
  3. 终止条件
    • 当 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是最大整数解
}

代码解析

  1. 边界处理
    • x == 0 或 x == 1 时直接返回 x,因为它们的算术平方根就是自身。
  2. 二分查找优化
    • 使用 mid := left + (right-left)/2 代替 (left+right)/2,防止大数相加时溢出。
  3. 比较逻辑
    • 通过 mid² 与 x 的比较动态调整区间,最终定位到满足条件的最右侧整数。

复杂度分析

指标说明
时间复杂度 O(log x) 二分查找每次将范围减半
空间复杂度 O(1) 仅需常数空间

示例验证

  • 示例1x = 4
    中间值 mid=22²=4 直接返回结果 2。

  • 示例2x = 8
    循环中 mid=2 时 2²=4 < 8,调整左边界为 3;最终 right=2,返回 2。


关键点总结

  • 算法选择:二分查找是解决此类问题的经典方法,效率远高于暴力遍历。
  • 溢出处理:通过调整中间值计算方式避免大数相加溢出。
  • 结果定位:循环结束时 right 始终指向最大的合法整数解。

该方法完全满足题目要求,且能高效处理大数值输入。

posted @ 2025-04-01 17:27  云隙之间  阅读(32)  评论(0)    收藏  举报