x 的平方根
LeetCode 69:在整数候选区间内用二分查找得到平方根的整数部分。
题目:69. x 的平方根
给你一个非负整数 x,计算并返回 x 的 算术平方根。
由于返回类型是整数,结果只保留 整数部分,小数部分将被 舍去。
注意: 不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5。
示例 1:
- 输入:
x = 4 - 输出:
2
示例 2:
- 输入:
x = 8 - 输出:
2 - 解释:
8的算术平方根是2.82842...,由于返回类型是整数,小数部分将被舍去。
1. 查找过程
以 x = 8 为例,要找的是 平方不超过 8 的最大整数。非负整数越大,平方越大,可以用二分查找缩小范围。
下面是区间示意:k 表示候选整数,k² 表示它的平方;L、M、R 对应代码中的 l、mid、r。
第 1 轮:检查 [0, 7]
| |
mid = 3,3 * 3 = 9 > 8。3 已经太大,右侧的数也都太大。
更新 r = mid - 1,得到 r = 2,剩下 [0, 2]。
第 2 轮:检查整数 [0, 2]
| |
mid = 1,1 * 1 = 1 < 8。1 满足条件,但右侧可能还有更大的答案。
更新 l = mid + 1,得到 l = 2,只剩 2。
第 3 轮:只检查整数 2
| |
mid = 2,2 * 2 = 4 < 8,继续向右找:l = mid + 1,得到 l = 3。
此时 l > r,结束查找。两侧边界停在这里:
| |
2 的平方没超过 8,再大一个整数 3 就超过了,所以返回 r = 2。
2. Python 实现
num 对应题目中的 x。当 num >= 2 时,整数平方根小于 num,右边界可以取 num - 1。
| |
| |
3. 复杂度
- 时间复杂度:
O(log x),每轮将整数候选区间缩小约一半。 - 额外空间复杂度:
O(1),只维护固定数量的整数变量。
评论
使用 GitHub 登录后参与讨论,评论将公开保存在 GitHub。
站长管理删除会同步到 GitHub,无法撤销。
阅读到这里时加载评论。