题目描述
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sqrtx
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
-
示例1
输入: 4
输出: 2 -
示例2
输入: 8
输出: 2
说明: 8 的平方根是 2.82842…,由于返回类型是整数,小数部分将被舍去。
解题思路
不用sqrt()函数求解,很容易想到的方法是从1到n寻找一个数i,使得i的平方小于等于n且(i+1)的平方大于n。而对于有序数列的查找,二分法是一种不错的方法。
当然你也会细心地发现,除1以外,其它自然数在整除2之后再平方会大于本身,因此一开始的范围可以不用设定为0~n,而是设置为0~(n整除2)。
代码详解
class Solution {
public int mySqrt(int x) {
int p = 0; // 左指针
int q = x / 2; // 右指针
int ans = 0; // 结果
int mid = 0; // 二分法查询
if(x == 1) {
return 1; // 把特殊情况1排除
}
while(p <= q) { // 寻常的二分法代码
mid = (p + q) / 2;
if ((long)mid * mid <= x) { // long防止平方超出int范围
ans = mid;
p = mid + 1;
} else {
q = mid - 1;
}
}
return ans;
}
}
注意点
- 可以缩小初始查找范围(但也只是减少了二分法查询操作的第一步)
- 注意int的平方的越界问题
- 也可用幂指数与对数的关系不讲武德式的直接计算出结果