给定一个正整数 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()函数的一种原理