给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。
说明:不要使用任何内置的库函数,如 sqrt。
示例 1:
输入:16
输出:True
示例 2:
输入:14
输出:False
题解:
-
这道题最容易想到的解决方法是循环求解,如果i的平方等于num则return true,否则返回false。但是这种方法的时间复杂度高。
-
另一种方法是一想到这种循环的,我们可以根据二分法进行,如果可以找到中间值,则返回true。
-
看热评区的大佬思路,发现之前自己的数学白学了,前n个奇数项相加,结果为n^2。
二分法:
时间和内存消耗为:
代码为:
class Solution {
public boolean isPerfectSquare(int num) {
int left=1,right=num;
while(right>=left){
int mid=(left+right)/2;
if((long)mid*mid==num) {
return true;
}
else if((long)mid*mid>num){
right=mid-1;
}else{
left=mid+1;
}
}
return false;
}
}
奇数项求和:
时间和内存的消耗为:
代码为:
class Solution {
public boolean isPerfectSquare(int num) {
int i=1;
while(num>0){
num-=i;
i+=2;
}
return num==0;
}
}