Skip to content

69.x 的平方根 ​

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;
	}
};