前言:这是我们大学社团给我们大一新生布置的每日一题任务,因为本人编程理解有限,参考价值较低。
题目链接https://leetcode-cn.com/problems/sqrtx/ 用正常语句还原Sqrt(x),看到题目直接暴力:
class Solution {
public:
int mySqrt(int x) {
long long i = 1,j = x; //换成long long防止数据爆int
while(i*i<=j)i++;
return i-1;
}
};
其实我没想到这样能过......但想了想,int上限是2^31-1,众所周知2^10=1024≈10^3,所以int的上限还可近似表示为2*10^9,开个平方根就连10w都不到,的确能过的......
我本来是想提出一种用二分法来查找的方法的,但没想到根本用不上。但我还是把二分法写法写出来吧:
class Solution {
public:
long long n;
bool judge(long long c){
return (c*c <= n && (++c)*c > n);
}
long long Dic(long long L,long long R){
long long c = (L+R)/2;
if(c*c>n)return Dic(L,c);
if(judge(c))return c;
return Dic(c,R);
}
int mySqrt(int x) {
n = (long long)x;
return (int)Dic(1,n);
}
};
这样的时间复杂度是O(log2(n)),最多计算三十多次就可以得出答案,比暴力快上不少。