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------------------------------------------------------------------------------------------------------------------------------
题意
在不适用库函数的情况下,判断一个数是否为某个数的平方。
思路
最简单的思路就是利用循环,当i的值大于num值的一半时结束循环,然后判断i*i是否等于num。
这样虽然可以实现需求,但是耗时比较长,需要更进一步的程序优化。
代码
public static boolean isPerfectSquare(int num){
long left = 1;
long right = num / 2;
while (left + 1 < right) {
long mid = left + (right - left) / 2;
if (mid * mid > num) {
right = mid;
} else if (mid * mid == num) {
return true;
} else {
left = mid;
}
}
if (left * left == num) {
return true;
}
if (right * right == num) {
return true;
}
return false;
}
在num/2的基础上,再进行了折半查找,执行循环的条件是left+1>right,如果改为left>right,则有可能进入死循环。
比如当num=4时,left=1,right=2,mid=1;此时,mid*mid=1,小于num,则执行left=mid,这样left还是1,又会进行同样的循环。