x 的平方根
- 标签(题目类型):数学、二分查找
题目描述
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入: 4
输出: 2
示例 2:
输入: 8
输出: 2
解释: 8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
思路及实现
方式一:二分查找
思路
由于平方根函数的性质,我们知道平方根一定位于0和x之间(x为非负整数)。因此,我们可以使用二分查找算法在0到x之间查找平方根。在每次迭代中,我们计算中间值mid的平方,如果它等于x,则mid就是平方根;如果它小于x,则平方根一定在mid的右侧;如果它大于x,则平方根一定在mid的左侧。通过不断缩小查找范围,最终我们可以找到平方根。
代码实现
Java版本
public class Solution {
public int mySqrt(int x) {
if (x < 2) return x; // 特殊情况处理
long left = 2; // 左边界设为2,因为1的平方根为1,无需查找
long right = x / 2; // 右边界设为x/2,因为平方根不会大于x/2
while (left <= right) {
long mid = left + (right - left) / 2; // 防止溢出
long square = mid * mid;
if (square == x) {
return (int) mid;
} else if (square < x) {
left = mid + 1; // 平方根在mid右侧
} else {
right = mid - 1; // 平方根在mid左侧
}
}
// 因为我们查找的是小于等于x的最大的平方根,所以返回right
return (int) right;
}
}
说明:
- 使用
long
类型进行中间计算,防止整数溢出。- 当
square
等于x
时直接返回结果。- 如果
square
小于x
,则平方根一定在mid
的右侧,因此更新左边界为