给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。
说明:不要使用任何内置的库函数,如 sqrt。
示例 1:
输入:16
输出:True
示例 2:
输入:14
输出:False
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-perfect-square
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这里有大概四种方法处理这个问题,第一种暴力无脑循环:
class Solution:
def isPerfectSquare(self, num: int) -> bool:
i = 1
while i * i < num:
i += 1
return i * i == num;
首先i从1开始,判断这个数是不是i的平方
不是的话,i 每次加1
直到超过了num
第二种在第一种思路上优化一下,使用老朋友二分查找:
class Solution:
def isPerfectSquare(self, num: int) -> bool:
if num < 2:
return True
left, right = 2, num // 2
while left <= right:
x = left + (right - left) // 2
guess_squared = x * x
if guess_squared == num:
return True
if guess_squared > num:
right = x - 1
else:
left = x + 1
return False
第三种,运用完全平方数的性质:
任意一个平方数可以表示成这样的奇数序列和:
bool isPerfectSquare(int num){
unsigned int n=num,i=1;
for(i=1;i<=num;i+=2)
{
n=n-i;
if(n==0)
return true;
}
return false;
}
bool isPerfectSquare(int num){
int lastnum=4,newnum=0,lastguess=0,newguess=0,count=0;
lastguess=lastnum;
while(lastguess!=newguess)
{
lastguess=lastnum;
newnum=(int)(lastnum+(int)(num/lastnum))/2;
newguess=newnum;
lastnum=newnum;
count++;
if(count>20)
return false;
}
if(newguess*newguess==num)
return true;
else
return false;
}
这是我的笨比牛顿迭代法,这是简洁版的:
class Solution:
def isPerfectSquare(self, num: int) -> bool:
i = num
while i * i > num:
i = (i + num / i) // 2
return i * i == num
牛顿迭代法也是sqrt()函数的一种原理