题目描述
给你一个正整数 num 。如果 num 是一个完全平方数,则返回 true ,否则返回 false 。
完全平方数 是一个可以写成某个整数的平方的整数。换句话说,它可以写成某个整数和自身的乘积。
不能使用任何内置的库函数,如 sqrt() 。
问题分析
采用二分法去寻找平方根,最后一定会将数字锁定到某一个整数上,然后比较此整数平方是否等于目标数即可。
时间复杂度在
O
(
l
o
g
2
n
)
O(log_2n)
O(log2n)
还有更加简便的一种方法,此方法引用自Avinaash_2005,此引用已经征得原作者的同意。
那就是设 x 为数的平方根
x^2=n
x=n/x
2x=n/x+x
x=0.5(n/x+x);
然后我们将其存储在一个整数中(将其四舍五入到最接近的整数)
如果它是一个完美的正方形,则整数和双精度值相等
否则我们返回 false
代码
bool isPerfectSquare(int num){
int left = 0;
int right = num;
long long middle = (left+right)/2;
if(num==1){
return true;
}
long long n = num;
while(left<=right){
if(middle*middle>n){
right = middle-1;
}else if(middle*middle==n){
return true;
}else{
left = middle+1;
}
middle = (left+right)/2;
}
if(middle*middle == n){
return true;
}
return false;
}
下面是Avinaash_2005给出的解答
bool isPerfectSquare(int num){
int count=0;
double x=1;
while(count!=20)
{
x=(x+num/x)*0.5;
count++;
}
num=x;
if(num==x)
return true;
else
return false;
}