题目描述
给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。
说明:不要使用任何内置的库函数,如 sqrt 。
示例 1:
输入:16
输出:True
示例 2:
输入:14
输出:False
思路
一、直接循环判断的方法会超时,用简单的二分查找即可,注意这里的q和mid在处理时可能比较大,要用long long存一下;
二、1+3+5+...+2n-1 = n^2,所以每个完全平方数都可以表示成奇数累加的和,利用这个性质也可以做。
方法一
class Solution {
public:
bool isPerfectSquare(int num) {
int start = 0;
int end = num;
while(start<=end){
long long mid = (start+end)/2;
long long q = mid*mid;
if(q == num){
return true;
}else if(q>num){
end = mid-1;
}else{
start = mid+1;
}
}
return false;
}
};
方法二
class Solution {
public:
bool isPerfectSquare(int num) {
int i = 1;
while(num>0){
num -= i;
i += 2;
}
return num == 0;
}
};