原题目
给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。
说明:不要使用任何内置的库函数,如 sqrt。
示例 1:
输入:16
输出:True
示例 2:
输入:14
输出:False
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-perfect-square
题目分析
方法一,顺序查找法:
从零开始一直查到sum,
改进:
测试用例会出现整形的最大数值,所以用if(i*i==sum)显示错误,要么改为long long型比较,要么用在本身的基础上加以改进,用pow(i,2)也可以比较
方法二,二分查找法:
方法三,数学规律法:
每一个数的平方与前一个数的平方差是公差为2 的等差数列
1 * 1=1
2 * 2=4
3 * 3=9
4 * 4=16
a1=3 a2=5 a3=7 d=2
利用 1+3+5+7+9+…+(2n-1)=n^2,即完全平方数肯定是前n个连续奇数的和
完整代码
顺序查找法:
bool isPerfectSquare(int num){
for(int i=1;i<=num;i++)
if(i<num/i)continue;
else if(num==(num/i)*(num/i))
return true;
else
return false;
return false;
}
二分查找法:
bool isPerfectSquare(int num) {
int start=1;
int end=num;
int mid=start+(end-start)/2;
while(start<=end)
{
if(pow(mid,2)>num)
{
end=mid-1;
}
else if(pow(mid,2)<num)
{
start=mid+1;
}
else return true;
mid=(end-start)/2+start;
}
return false;
}
数学规律法:
bool isPerfectSquare(int num){
int s=num;
int i=1;
while(s>0)
{
s=s-i;
i=i+2;
}
if(s==0)return true;
else return false;
}
总结
扩展数学思维