一.相关链接
题目链接:367.有效的完全平方数
二.心得体会
本题依然能够通过遍历来暴力解出,也可以通过二分法来实现。
而通过数学公式: (n+1)^2 - n^2 = 2n + 1 可知每个平方数都相隔 2n+1,那么完全可以依次减去1,3,5,......若最终得0则说明是个完全平方数,若为负数则不是完全平方数。
本题也可以通过牛顿迭代法求解,本题与第69题的区别仅仅在于最终的比较与输出。
三.代码
1)暴力:
class Solution {
public:
bool isPerfectSquare(int num) {
if(num == 1) return true;
for(int i=2;i<=num/2;i++)
{
if((long long) i*i == num)
return true;
}
return false;
}
};
2)二分法:
class Solution {
public:
bool isPerfectSquare(int num) {
if(num == 1) return true;
int right = num/2;
int left = 2;
int middle = -2;
while(left<=right)
{
middle = left + (right-left)/2;
if((long long)middle*middle < num)
left = middle + 1;
if((long long)middle*middle > num)
right = middle -1;
if((long long)middle*middle == num)
return true;
}
return false;
}
};
3)数学方法:
class Solution {
public:
bool isPerfectSquare(int num) {
int odd_number = 1;
while(num>0)
{
num -= odd_number;
odd_number += 2;
}
return num == 0;
}
};
4)牛顿迭代法:
class Solution {
public:
bool isPerfectSquare(int num) {
if(num == 1) return true;
double k0 = num/2;
double k1 = -2;
while(true){
k1 = 0.5 * (k0 + num / k0);
if(fabs(k0 - k1) < 1e-7)
break;
k0 = k1;
}
int ans = (int) k0;
return ans * ans == num;
}
};