给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。
进阶:不要 使用任何内置的库函数,如 sqrt 。
示例 1:
输入:num = 16
输出:true
方法一:双指针
双指针反复判断边界,需要注意的点是储存值要为long不然结果可能溢出(当然聪明的你可以通过求余来降低空间复杂度,我就直接写了看起来直观点)。
public static boolean isPerfectSquare(int num) {
int left = 1, right = num/2;
while (left < right) {
int middle = (left+right)/2;
long result = (long) middle *middle;
if (result == num) {
return true;
} else if (result > num) {
right = --middle;
} else { // ^2 < num
left = ++middle;
}
}
return left*left == num;
}