1、题目
Given a positive integer num, write a function which returns True if num is a perfect square else False.
Note: Do not use any built-in library function such as sqrt.
Example 1:
Input: 16
Returns: True
Example 2:
Input: 14
Returns: False
2、求解一:比较正常的解法,也是比较容易想到的
public boolean isPerfectSquare(int num) {
boolean flg = false;
//注意这里要考虑特殊情况
if(num == 1) return true;
//这里要从i=1开始,并且要有等号,这是在debug中测试发现的漏洞之处,导致一致不能accept
for(int i = 1; i <= num/i; i++){
if(num == i * i){
flg = true;
}
}
return flg;
}
3、求解二:针对第一种思路,如何减小i遍历的次数
思路:如果num=36 ,对num/2=16, 16 * 16 =256 > num;再对16 / 2 = 8 ; 8 * 8 = 64 > num ; 再对8 /2 =4,4 * 4 < num , 所以现在我们就将范围缩小到了 4 --8 ,所以有的时候我们只需要简单用一个实际的例子就可以找出大概思路了
public boolean isPerfectSquare(int num) {
if(num == 1) return true;
long m = num / 2;
long r = m * m;
while( r > num){
m = m /2 ;
r = m * m;
}
//这里使得i的遍历次数最小
for(long i = m; i < 2 * m; i++){
if(m * m == num){
return true;
}
}
return false;
}
4、求解四:二分法来寻找
public boolean isPerfectSquare(int num) {
int left = 1;
int right = num;
//利用while循环以 left<=right为终止条件
while (left <= right){
int middle = left + (right - left)/2;
int s = middle * middle;
if(s == num) return true;
if(s > num){
right = middle -1;
}else left = middle + 1;
}
return false;
}
5、求解五:利用完全平方是一系列奇数之和
public boolean isPerfectSquare(int num) {
//这里如何判断num是由一系列奇数的相加之和
//利用while循环 看最后剩下的是不是0
int i = 1;
while (num > 0){
num = num - i;
i = i + 2;
}
return num == 0;
}