69. Sqrt(x)
一、问题描述
Implement
int sqrt(int x)
.Compute and return the square root of x.
二、输入输出
三、解题思路
二分法
- 直接写二分法超时了,不知道为什么
int Sqrt(int x, int low, int high)
{
int mid;
while(low <= high)
{
mid = (low+high)/2;
if(mid * mid == x)return mid;
else if(mid * mid < x){
low = mid+1;
}
else{
high = mid-1;
}
}
if(mid*mid > x)return mid-1;
return mid;
}
- 使用递归版的二分法倒是通过,程序非常简单,就不多讲了。我觉得二分法是这道题普通人能想到的最好的解法了。
class Solution {
public:
int Sqrt2(int x, int low, int high){
if(low > high)return high;
int mid = (low+high)/2;
if(mid > x / mid){
return Sqrt2(x, low, mid-1);
}else if(mid < x / mid){
return Sqrt2(x, mid+1, high);
}else{
return mid;
}
}
int mySqrt(int x) {
if(x<0)return INT_MIN;
if(x == 0)return 0;
return Sqrt2(x, 1, x);
}
};
Newton Solution
- 这个算法比较巧,在wiki上看到的,
r = (r + x/r)/2
把这个式子化简下就是r*r = x 确实很巧,搞不懂记住就好了
class Solution {
public:
int mySqrt(int x) {
long long r = x;
while(r * r > x)
r = (r + x/r)/2;
return r;
}
};
遍历
- 最基本的想法,但是当x比较大的时候,速度会非常慢,TLE了
int mySqrt(int x) {
if(x < 0)return INT_MIN;
int i;
for (i = 0; i*i < x; ++i) ;
if(i*i == x)return i;
else return i-1;
}