69. x 的平方根
实现 int sqrt(int x) 函数。计算并返回 x 的平方根,其中 x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/sqrtx
输入: 8
输出: 2
说明: 8 的平方根是 2.82842…,
由于返回类型是整数,小数部分将被舍去。
输入: 4
输出: 2
方法一:暴力法,可能会超过时间限制,C++大概在56ms.
class Solution {
public:
int mySqrt(int x) {
if (x== 0) return 0; //=0,直接返回0
else if(x >= 1 && x < 4) //>=1和<4时,直接返回1
{
return 1;
}
else
{
for (long i = 2; i <= x/2; i++) //此时非负数的平方根不可能超过它的一半
{
if (i*i == x)
{
return i;
}
else if ((i*i < x) && (((i+1)*(i+1)) > x))
{
return i;
}
}
}
return 0;
}
};
方法二:二分法
class Solution {
public:
int mySqrt(int x) {
//一个数n的平方根,不肯能大于n / 2 + 1
// 计算过程中可能会溢出,所以用long 和 long long
long i = 0;
long j = x / 2 + 1;
long long mid;
long long result;
while(i <= j)
{
mid = (i + j) / 2;
result = mid * mid;
if (result == x) return mid; //刚好相等直接返回mid
else if (result < x) i = mid + 1; // 小于时,表明平方根在mid的右边,所以i + 1
else j = mid - 1; //大于时,表明平方根在mid的左边,所以j-1
}
return j; //此时返回的是平方根是小数的整数值
}
};
方法三:牛顿迭代法
class Solution {
public:
int mySqrt(int x) {
if (x == 0) return 0;
double last=0;
double res=1;
while(res!=last)
{
last=res;
res=(res+x/res)/2;
}
return int(res);
}
};
牛顿迭代法没看懂,后面再来看,代码搬运别人的。