题目
给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。
说明:不要使用任何内置的库函数,如 sqrt。
示例 1:
输入:16
输出:True
示例 2:
输入:14
输出:False
代码模板:
class Solution {
public boolean isPerfectSquare(int num) {
}
}
分析
两种方案:
- 数学归纳法:举例每个平方数1,4,9,16,25,36,49,64,81,100两个之间相差是n个基数的和,即1,3,5,7,9,11,13,15等等。通过这样的方法减去每个差,看这个数等不等于0,就能得出结论了。
- 二分查找法:通过一个low和high来。
- 查找平方法。从1开始循环平方,如果平方小于num,就继续,直到大于或者等于。
PS:这道题有个需要注意的地方,一定要用long来作为变量,不然会出现超时,2147483647的时候会超时。
解答
数学归纳法:
class Solution {
public boolean isPerfectSquare(int num) {
for(int i = 1; num > 0; i += 2){
num -= i;
}
return num == 0;
}
}
二分查找法:
class Solution {
public boolean isPerfectSquare(int num) {
if(num ==1){
return true;
}
long low = 1;
long high = num;
while(low<=high){
long middle = low+(high-low)/2;
if(middle*middle == num){
return true;
}else if(middle*middle<num){
low = middle+1;
}else{
high = middle-1;
}
}
return false;
}
}
查找平方法:
class Solution {
public boolean isPerfectSquare(int num) {
if(num <= 0){
return false;
}
if(num == 1){
return true;
}
long square = 2;
while(square*square <= num){
if(num == square*square){
return true;
}
square++;
}
return false;
}
}