69.x 的平方根
自己实现一个开方运算,然后精度放在了整数级别,且不是四舍五入,而是方向固定的舍去小数部分。
这个题就可以使用二分查找来做。
把0到x作为区间来看,每次取中间,看看中间这个数的平方和x的大小关系,平方大了就缩小,小了就放大。
然后关于这个舍去小数的问题,二分查找的天然属性可以解决这个问题:二分查找的寻找边界可以自己设置一个偏向,在这个问题中,显然我们只要找到最后一个使得平方值小于等于x的整数即可。也就是“最后一个小于等于”,找的右边界,那我们只需要在大于的时候把right往左推,小于等于的时候往右推,最终的right位就是我们要找的东西。相似的逻辑在34中有。
注意
middle的平方可能爆int,记得类型转换long long一下。
完整代码
cpp
class Solution {
public:
int mySqrt(int x)
{
int l = 0, r = x, m;
while (l <= r) {
m = l + (r - l) / 2;
if (static_cast<long long>(m) * m > x) {
r = m - 1;
}
else {
l = m + 1;
}
}
return r;
}
};