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

LeetCode - 69. x 的平方根

题目

69. x 的平方根 - 力扣(LeetCode)

思路

初始化搜索范围:

  • 对于 x = 0,直接返回 0
  • 对于 x > 0,设置 left = 1, right = x

二分查找过程:

  • 当 left ≤ right 时循环:
  • 计算中点 mid = left + (right - left) / 2
  • 比较 mid 与 x/mid 的关系(等价于比较 mid^2 与 x,但避免溢出)
  • 如果 mid > x/mid:说明 mid 太大,更新 right = mid - 1
  • 如果 mid < x/mid:说明 mid 太小,更新 left = mid + 1
  • 如果 mid = x/mid:找到精确平方根,直接返回 mid

处理非完全平方数:

  • 循环结束后,right 是小于等于平方根的最大整数
  • 返回 right 作为结果

关键技巧

避免整数溢出:

  • 使用 mid > x/mid 代替 mid^2 > x
  • 这种比较方式数学上等价,但避免了中间结果溢出

边界处理:

  • 特殊处理 x = 0 的情况
  • 初始化 right = x 而不是 x-1,确保覆盖所有可能值

返回值选择:

  • 循环结束时 left > right
  • right 指向小于等于平方根的最大整数
  • left 指向大于平方根的最小整数

时间和空间复杂度

  • 时间复杂度:O(log x),二分查找的标准复杂度
  • 空间复杂度:O(1),只使用常数额外空间

读者的错误写法

class Solution {
public:int mySqrt(int x) {int left = 0;int right = x-1;while(left <= right){int mid = left + (right-left)/2;if(mid*mid > x){right = mid-1;}else if(mid*mid < x){left = mid+1;}else if(mid*mid == x){return left;}}return left;}
};

初始化错误:

  • right = x-1 可能会导致问题。如果 x = 0,那么 right = -1,这是一个无效的索引。
  • 正确的初始化应该是 right = x,因为平方根不会超过 x 本身。

返回值错误:

  • 当找到 mid*mid == x 时,你返回的是 left 而不是 mid。
  • 应该返回 mid,因为 mid 是满足条件的值。

整数溢出风险:

  • 当 x 很大时,mid*mid 可能会导致整数溢出。
  • 应该使用 mid <= x/mid 进行比较,避免溢出。

循环结束后的返回值:

  • 循环结束后,你返回 left,但此时 left > right,left 指向的是第一个大于平方根的值。
  • 应该返回 right,因为 right 指向的是最后一个小于等于平方根的值。

正确写法

class Solution {
public:int mySqrt(int x) {int left = 1;int right = x;while(left <= right){int mid = left + (right-left)/2;if(mid > x/mid){right = mid-1;}else if(mid < x/mid){left = mid+1;}else if(mid == x/mid){return mid;}}return right;}
};

相关文章:

  • 数据结构 学习 链表 2025年6月14日08点01分
  • 力扣Hot100每日N题(15~16)
  • sqli-labs靶场46-53关(综合)
  • 拆解 CMS/G1/ZGC 三种垃圾回收器算法过程
  • Python实战应用-Python操作MySQL数据库
  • leetcode2-两数相加
  • 【CF】Day84——Codeforces Round 862 (Div. 2) D (⭐树的直径的性质 + DFS找树的直径)
  • K8S中使用英伟达GPU
  • 在 CentOS中安装Docker并安装青龙脚本——笔记
  • Vue3 实现老虎机抽奖游戏
  • Spring AI Alibaba Graph 实践
  • 【AD笔记】嘉立创元件导入到AD中(原理图-pcd-3D模型)
  • Elasticsearch从安装到实战、kibana安装以及自定义IK分词器/集成整合SpringBoot详细的教程ES(四)查询、排序、分页、高亮
  • DBAPI如何实现API编排
  • Excel大厂自动化报表实战(互联网金融-数据分析周报制作下)
  • 仿飞书部门选择器
  • 【YOLO 系列】基于YOLO的车载摄像头道路标志和车辆目标检测识别系统【python源码+Pyqt5界面+数据集+训练代码】
  • ELK 日志分析系统深度解析与实战指南
  • C++批量读取指定后缀文件
  • GTSAM中InitializePose3::initialize()使用详解
  • 网站开发和软件测试哪个好/广告联盟app推广
  • 个人网站 组建/上海百度seo牛巨微
  • 做的比较好的冷柜网站有哪些/如何接广告赚钱
  • 做受视频网站 mcb3dbd/营销的概念是什么
  • 网站安全管理制度建设下载/怎么做竞价托管
  • 台州汇客网站建设/童程童美少儿编程怎样收费