给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。
说明:不要使用任何内置的库函数,如 sqrt。
/**
* 解法一
*
* @param num num
* @return boolean
*/
private static boolean isPerfectSquare(int num) {
if (num >= 4) {
int i = 2;
while (i < num) {
if (i * i == num) {
return true;
}
i++;
}
} else {
return num == 0 || num == 1;
}
return false;
}
/**
* 解法二
*
* @param num num
* @return boolean
*/
private static boolean isPerfectSquare1(int num) {
if (num < 0) {
return false;
} else if (num == 0 || num == 1) {
return true;
}
int left = 1;
int right = num;
while (left <= right) {
int middle = (left + right) / 2;
if (middle * middle > num) {
right = middle;
} else if (middle * middle == num) {
return true;
} else {
left = middle;
}
}
return false;
}
/**
* 解法三
*
* @param num num
* @return boolean
*/
private static boolean isPerfectSquare2(int num) {
if (num < 0) {
return false;
} else if (num == 0 || num == 1) {
return true;
}
int sum = 0;
for (int i = 1; i < num; i += 2) {
sum += i;
if (sum > num) {
break;
}
if (sum == num) {
return true;
}
}
return false;
}
其中解法三的效率最高。
- 解法一为暴力法
- 解法二为二分法
- 解法三则是寻找规律-----一个完全平方数是前N个奇数的和