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

3.4 二分查找专题:LeetCode 69. x 的平方根

1. 题目链接

LeetCode 69. x 的平方根


2. 题目描述

给定一个非负整数 x,计算并返回 x 的平方根的整数部分(向下取整)。
示例

  • 输入:x = 4 → 输出:2
  • 输入:x = 8 → 输出:2(实际平方根为 2.828,取整数部分)。

3. 示例分析
  1. 目标值是完全平方数
    • x = 16 → 返回 4
  2. 目标值非完全平方数
    • x = 10 → 返回 33^2 = 9 ≤ 104^2 = 16 > 10)。

4. 算法思路

二分查找法

  1. 初始化指针left = 1right = x(处理 x = 0 的特殊情况直接返回 0)。
  2. 循环缩小范围
    • 计算中间值 mid = left + (right - left + 1) / 2向上取整,避免死循环)。
    • mid * mid ≤ x,说明目标在右半区间,调整 left = mid
    • mid * mid > x,说明目标在左半区间,调整 right = mid - 1
  3. 终止条件:当 left == right 时,返回 left(最大满足 k^2 ≤ x 的整数)。

5. 边界条件与注意事项
  1. 处理 x < 1:直接返回 0,避免进入循环。
  2. 溢出问题:中间值 mid 使用 long long 类型,防止 mid * mid 溢出。
  3. 循环终止条件:必须使用 mid向上取整,否则可能陷入死循环(例如 x = 2)。

6. 代码实现
class Solution 
{
public:
    int mySqrt(int x) 
    {
        if(x < 1) return 0;
        int left = 1, right = x;
        while(left < right)
        {
            long long mid = left + (right - left + 1) / 2;
            if(mid * mid <= x) left = mid;
            else right = mid - 1;
        }
        return left;
    }
};

在这里插入图片描述


暴力枚举法与二分查找法对比图表

对比维度暴力枚举法二分查找法
核心思想遍历 0√x,找到最大的 k 满足 k² ≤ x二分法缩小范围,定位最大满足 k² ≤ x 的整数。
时间复杂度O(√x)(需要遍历最多 √x 次)。O(log x)(每次将搜索范围缩小一半)。
空间复杂度O(1)(无需额外存储)。O(1)(仅需常数变量记录指针)。
实现方式单层循环逐个判断。循环调整左右指针,计算中间值并比较。
适用场景极小数据规模(x ≤ 1e3)。任意规模数据(尤其适合 x ≥ 1e6)。
优点实现简单,无需处理复杂边界条件。时间复杂度极低,适合处理大规模数据。
缺点数据规模大时性能极差(例如 x=1e18 时需 1e9 次操作)。需处理整数溢出和中间值取整逻辑。

http://www.kler.cn/a/591409.html

相关文章:

  • 构建一个基于快速非奇异终端滑模控制(FNTSMC)的仿真模型,运用不同趋近律与设计的趋近律开展对比,进而探究系统收敛时间和抖振幅值
  • 有哪些开源的智慧园区项目?
  • 产品战略之科学定价策略与模型(104页PPT)(文末有下载方式)
  • 网页复印机:只需一个网址,一键克隆任何网站!(可根据需求生成/优化相关代码)
  • Socket 、WebSocket、Socket.IO详细对比
  • uniapp报错 Right-hand side of ‘instanceof‘ is not an object
  • 在线JSON格式校验工具站
  • 基于SpringBoot+Vue3实现的宠物领养管理平台功能一
  • 应用层之网络应用模型,HTTP/HTTPS协议
  • 深度解析manus:技术原理剖析、开源平替方案架构分析
  • 搜广推校招面经五十四
  • linux 命令 vim
  • 【认知框架重构】
  • ubuntu 没有网卡的解决方案
  • 信贷系统的业务流程
  • HTML 专栏总结:回顾与展望
  • Java Stream API 之 flatMap
  • 学习使用 Git 和 GitHub 开发项目的教程推荐
  • Etcd 服务搭建
  • Word 小黑第29套