leetcode69. x 的平方根
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
示例 1:
输入:x = 4
输出:2
示例 2:
输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842…, 由于返回类型是整数,小数部分将被舍去。
目录
- leetcode69. x 的平方根
- 题目分析
- 二分法原理与步骤
- 原理
- 步骤
- 应用场景
- 复杂度分析
- 注意事项
- 总体思维导图
- 算法步骤
- 算法流程图
- 算法分析
- 相似题目
题目分析
这道题目要求我们实现一个函数mySqrt,返回给定整数x的平方根的整数部分。这里的关键是只返回整数部分,不需要考虑小数部分。题目可以通过二分查找的方法来解决,因为平方根具有单调性,即如果mid是x的平方根,那么比mid小的数不可能是x的平方根,比mid大的数也不可能是x的平方根。
二分法原理与步骤
原理
- 有序性假设:二分法适用于已排序的数组或列表。
- 范围缩小:通过比较中间元素与目标元素,不断将搜索范围分成两半。
- 迭代/递归过程:通过迭代或递归方式实现,每次迭代或递归调用都在更小的范围内搜索。
步骤
- 初始化:设定两个指针
low和high,分别指向数据集的开始和结束位置。 - 计算中间位置:
mid = low + (high - low) / 2。 - 比较中间元素:
- 如果中间元素等于目标值,搜索成功。
- 如果中间元素小于目标值,设置
low = mid + 1。 - 如果中间元素大于目标值,设置
high = mid - 1。
- 迭代或递归:根据比较结果更新
low和high,然后重复步骤2和3,直到找到目标元素或low>high。
应用场景
- 用于已排序数据集的快速查找。
- 如数据库索引、查找算法(如平方根查找)等。
复杂度分析
- 时间复杂度:O(log n),每次比较将搜索范围减半。
- 空间复杂度:O(1),只需常数级别额外空间。
注意事项
- 只适用于有序数据集。
- 小心处理边界条件,避免死循环或遗漏元素。
- 计算中间位置时使用
low + (high - low) / 2以避免整数溢出。
总体思维导图

算法步骤
- 初始化两个变量
i和j,分别代表查找范围的下界和上界,初始时i=1,j=x。 - 进行二分查找,计算中间值
mid。 - 检查
x/mid与mid的关系:- 如果
x/mid等于mid,说明找到平方根,返回mid。 - 如果
x/mid大于mid,说明平方根在mid的右侧,将i更新为mid+1。 - 如果
x/mid小于mid,说明平方根在mid的左侧,将j更新为mid-1。
- 如果
- 重复步骤2和3,直到
i大于j。 - 返回
j,即为x的平方根的整数部分。
算法流程图
算法分析
- 时间复杂度:O(logx),因为每次迭代都将搜索范围减半。
- 空间复杂度:O(1),使用了常数空间。
- 易错点:在计算
mid时,应避免直接使用(i+j)/2,以防止整数溢出。正确的做法是使用i+(j-i)/2。 - 注意点:在判断
x/mid与mid的关系时,应使用整数除法,即x/mid。
相似题目
| 题目 | 链接 |
|---|---|
| 69. Sqrt(x) | 链接 |
| 367. Valid Perfect Square | 链接 |
| 441. Arranging Coins | 链接 |



















