力扣367题
题目描述:
给你一个正整数
num
。如果num
是一个完全平方数,则返回true
,否则返回false
。完全平方数 是一个可以写成某个整数的平方的整数。换句话说,它可以写成某个整数和自身的乘积。
不能使用任何内置的库函数,如
sqrt
。
题解思路:
两种方法:
① 数学法:根据完全平方数的特性,完全平方数符合 n=1+3+5+···+(2n-1),不断相减直至为0,说明是完全平方数;
② 二分法:需要注意的是类型转换,当mid很大时相乘可能会超过int类型的最大值,因此用 long 来存放。
方法①
public boolean isPerfectSquare(int num) {
int x=1;
while (num>0){
num-=x;
x+=2;
}
return num==0;
}
方法②
public boolean isPerfectSquare(int num) {
if (num == 0 || num == 1) {
return true;
}
int left = 1;
int right = num;
int mid = 0;
while (left <= right) {
mid = (left + right + 1) / 2;// 保证处理到右边界
long res=(long) mid*mid;// 当mid很大时相乘可能会超过int类型的最大值,因此用long来存放
if (res == num) {
return true;
} else if (res > num) {
// [left,mid-1]区间继续找
right=mid-1;
}else {
// [mid+1,right]区间继续找
left=mid+1;
}
}
return false;
}