先来说说普通方法,就是调用库函数sqrt,如果一个数的开方的平方等于它本身,这个数字就是完全平方数,因为如果它的开方是float或者double型,转换为int型会有数字缺失,他们的平方就不会是这个数本身。
class Solution {
public boolean isPerfectSquare(int num) {
int m=(int)Math.sqrt(num);
if(m*m==num) {
return true;
}
return false;
}
}
再来说说进阶,其实试过之后,进阶的时间复杂度,空间复杂度其实和普通方法差不多,没必要这么写,只是想让我们知道二分法可以判断一个数是不是完全平方数。
演示过程我找到一篇题解,就拿这位dalao的图来解释整个过程吧。
如果是1的话,就没有左右指针,我们又知道1是一个完全平方数,所以直接返回true,
一个数的开根肯定比他自己小,所以判断的范围就是在0-num,先求出来mid,如果mid的平方比num大,说明说明num的开方在mid的左边(不包括mid),如果mid的平方比num小,说明num的开方在mid的右边(不包括mid)。
lass Solution {
public boolean isPerfectSquare(int num) {
// 二分
if(num == 1) {
return true;
}
long left = 0;
long right = num;
long mid = (left+right)/2;
long tmp;
while(left <= right) {
tmp = mid * mid;
if(tmp == num) {
return true;
} else if(tmp > num) {
right = mid-1;
} else {
left = mid+1;
}
mid = (left+right)/2;
}
return false;
}
}