题目链接:367. 有效的完全平方数
给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。
进阶:不要 使用任何内置的库函数,如 sqrt 。
示例 1:
输入:num = 16
输出:true
示例 2:
输入:num = 14
输出:false
提示:
1 <= num <= 2^31 - 1
方法1:数学
对于一个完全平方数而言,可以写成这种形式:num=n^2=1+3+5+...+(2∗n−1)
因此另外一种做法是对 num进行不断的奇数试减,如果最终能够减到 0,说明 num 可展开成如 1+3+5+...+(2∗n−1) 的形式,num为完全平方数。
class Solution {
public:
bool isPerfectSquare(int num) {
int x = 1;
while(num > 0){
num -= x;
x += 2;
}
return num==0;
}
};
方法2:二分查找
class Solution {
public:
bool isPerfectSquare(int num) {
int left = 0, right = num;
while(left<=right){
long long mid = left + (right - left)/2;
long long x = mid * mid;
if(x < num){
left = mid + 1;
}else if(x > num){
right = mid - 1;
}else{
return true;
}
}
return false;
}
};
方法3:牛顿迭代法。
class Solution {
public:
bool isPerfectSquare(int num) {
int a = num;
long long ans = num;
while(ans * ans > num){
ans = (ans + a / ans)/2;
}
return ans*ans==num;
}
};