当前位置: 首页 > backend >正文

69.x的平方根

class Solution(object):

    def mySqrt(self, x):

        """

        :type x: int

        :rtype: int

        """

        l,r,ans = 0,x,-1

        while l <= r:

            mid = (l+r)//2

            if mid*mid <= x:

                ans = mid

                l =mid + 1

             

              # 能找到的mid*mid <= x 的最小值,<= target, 然后不断轮着,右边边界减1,直到遍历之后退出

            else:

                r =mid - 1

        return ans

代码解释:求平方根(整数部分)

这段代码使用 二分查找 来计算非负整数 x 的平方根的 整数部分(即向下取整)。例如:

  • mySqrt(4) 返回 2(因为 2² = 4
  • mySqrt(8) 返回 2(因为 2² = 4 < 8,而 3² = 9 > 8
关键变量:
  • l:左边界(初始为 0
  • r:右边界(初始为 x
  • ans:存储当前满足 mid² ≤ x 的最大 mid(初始为 -1
算法流程:
  1. 初始化l = 0r = xans = -1
  2. 循环条件while l <= r,只要搜索范围有效(左边界 ≤ 右边界),就继续查找。
  3. 计算中间值
    • mid = (l + r) // 2(取中间位置)。
  4. 比较 mid² 和 x
    • 如果 mid² ≤ x
      • 说明 mid 可能是平方根的整数部分,记录 ans = mid
      • 尝试找更大的 mid,调整 l = mid + 1(向右搜索)。
    • 如果 mid² > x
      • 说明 mid 太大,调整 r = mid - 1(向左搜索)。
  5. 循环结束
    • 返回 ans(即最大的满足 mid² ≤ x 的整数)。

具体例子

示例 1:x = 4

查找过程:

  1. 初始状态

    • l = 0r = 4ans = -1
  2. 第 1 轮循环

    • mid = (0 + 4) // 2 = 2
    • 2² = 4 ≤ 4 → ans = 2l = 3
    • 新的搜索范围:l = 3r = 4
  3. 第 2 轮循环

    • mid = (3 + 4) // 2 = 3
    • 3² = 9 > 4 → r = 2
    • 新的搜索范围:l = 3r = 2(不满足 l <= r,循环终止)

结果ans = 2(因为 2² = 44 的平方根)。

示例 2:x = 8

查找过程:

  1. 初始状态

    • l = 0r = 8ans = -1
  2. 第 1 轮循环

    • mid = (0 + 8) // 2 = 4
    • 4² = 16 > 8 → r = 3
    • 新的搜索范围:l = 0r = 3
  3. 第 2 轮循环

    • mid = (0 + 3) // 2 = 1
    • 1² = 1 ≤ 8 → ans = 1l = 2
    • 新的搜索范围:l = 2r = 3
  4. 第 3 轮循环

    • mid = (2 + 3) // 2 = 2
    • 2² = 4 ≤ 8 → ans = 2l = 3
    • 新的搜索范围:l = 3r = 3
  5. 第 4 轮循环

    • mid = (3 + 3) // 2 = 3
    • 3² = 9 > 8 → r = 2
    • 新的搜索范围:l = 3r = 2(不满足 l <= r,循环终止)

结果ans = 2(因为 2² = 4 < 8,而 3² = 9 > 8)。

示例 3:x = 1

查找过程:

  1. 初始状态

    • l = 0r = 1ans = -1
  2. 第 1 轮循环

    • mid = (0 + 1) // 2 = 0
    • 0² = 0 ≤ 1 → ans = 0l = 1
    • 新的搜索范围:l = 1r = 1
  3. 第 2 轮循环

    • mid = (1 + 1) // 2 = 1
    • 1² = 1 ≤ 1 → ans = 1l = 2
    • 新的搜索范围:l = 2r = 1(不满足 l <= r,循环终止)

结果ans = 1(因为 1² = 11 的平方根)。

http://www.xdnf.cn/news/4675.html

相关文章:

  • MongoDB(六) - Studio 3T 基本使用教程
  • 顺丰科技:从 Presto 到 Doris 湖仓构架升级,提速 3 倍,降本 48%
  • OpenCV 基于生物视觉模型的工具------模拟人眼视网膜的生物视觉机制类cv::bioinspired::Retina
  • ffmpeg多媒体(音视频)处理常用命令
  • 按句子切分文本、保留 token 对齐信息、**适配 tokenizer(如 BERT)**这种需求
  • 【25软考网工】第五章(9)路由协议BGP、IS IS
  • PPT画图导出为PDF格式
  • 《云计算》第三版总结
  • Java 24:重构数字信任边界 —— 后量子时代的智能安全防御体系构建
  • 从装饰器出发,优雅处理 UI 自动化中的异常
  • Lost connect to debugger on ‘iphone‘
  • Webug4.0靶场通关笔记21- 第26关URL不安全跳转
  • 【Ubuntu】Netplan静态网络配置
  • 【ArcGIS技巧】用地块生成界址点去重、顺时针编号挂接DKBM属性
  • 四、Hadoop 2.X vs 3.X:特性、架构与性能全解析
  • 趣味编程:爱心
  • 昆仑万维财报解读:AI商业化卷王
  • CF每日5题
  • 《数据结构初阶》【链式二叉树】
  • 【时时三省】(C语言基础)怎样定义和引用二维数组
  • 数字孪生医疗:构建患者特异性数字孪生体路径探析
  • 【NLP 71、常见大模型的模型结构对比】
  • 缓存套餐-01.Spring Cache入门案例
  • 阿里云 golang 一面
  • 【开源】Python打造高效剪贴板历史管理器:实现跨平台生产力工具
  • 使用 Vite 创建 Vue 3 项目并手动配置路由的完整步骤
  • 如何通过服务主体获取 Azure 凭据
  • Ansible 流程控制
  • MySQL的索引和事务
  • @AutoConfigureBefore功能简介-笔记