您的位置:首页 > 其它

【LeetCode】(69)Sqrt(x)(Medium)

2015-08-24 20:48 441 查看

题目


Sqrt(x)

Implement
int sqrt(int x)
.
Compute and return the square root of x.

解析

就是自己实现开方运算,这里我使用的是迭代法,具体原理可以自己百度

class Solution {
public:
int mySqrt(int x) {
double ret = x;
while (abs(ret*ret-x)>0.5)
{
ret = (ret + (double)x/ret)/2.0;
}
return (int)ret;
}
};


想了想题目,既然是int,肯定不会是希望你用这种方法,应该是一道搜索题,找到最合适的。

从1到x/2中去搜索最有可能的就可以了。这里用二分法

看看大神的代码

class Solution {
public:
int mySqrt(int x)
{
int left = 1, right = x / 2;
int last_mid; // 记录最近一次mid
if (x < 2) return x;
while(left <= right)
{
const int 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;
}
};
大神用的x/mid 和mid进行比较,我们拿n=20来举例看看这个代码如何运行

相当于从1,2,3,4,5,6,7,8,9,10中找到一个数字的平方最接近但不大于20

先算出middle = 5,于是在1,2,3,4中寻找,找到中间数2,从3,4中寻找,找到4,left=right,再找到right=5。已经不满足条件了,会退出。

其实就是找到一个数字x/mid>mid,但是(x+1)/mid < mid
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: