题目要求
实现sqrt (int x)操作,计算并返回根号x。
主要思路
1、最先想到遍历操作,O(n)的时间,符合就返回。
2、更好一点的办法是二分查找,能让时间减少到O(logn),这里有个点需要注意右端从x/2开始,另外在判断时不能用r*r > x 因为r*r非常容易溢出。 我们通常用除法来代替乘法操作。
3、牛顿法,由高到低迭代逼近,会让人眼前一亮。
主要代码,二分法
class Solution {
public:
int sqrt(int x) {
if(x<2)
return x;
long left = 1;//1开始
long right = x/2;//右端从x/2开始
long mid, last_mid;
while(left<=right)
{
mid = left + (right-left)/2;
if(x/mid> mid) // 不用x > mid * mid 会溢出
{
left = mid + 1;
last_mid = mid; //若最后没找到,要返回一个最接近的。
}
else if(x/mid<mid)
right = mid - 1;
else
return mid;
}
return last_mid;
}
};
主要代码,牛顿法
class Solution {
public:
int sqrt(int x) {
long r = x;
while(x/r<r)//根据平方根找到第一个比x小的数
r = (r + x/r)/2;
return r;
}
};