题目描述
给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。
进阶:不要使用任何内置的库函数,如 sqrt 。
输入:num = 16
输出:true
题解
看到这道题目,我一眼就看到了进阶的要求——不要使用任何内置的库函数。
这就意味着,直接求根号对我们来说是不合要求的。
那么我们就要用乘方去验证而不是开方来求解。
暴力
class Solution:
def isPerfectSquare(self, num: int) -> bool:
x = 1
square = 1
while square <= num:
if square == num:
return True
x += 1
square = x * x
return False
直接循环,这显然不是最优解。
二分查找
class Solution:
def isPerfectSquare(self, num: int) -> bool:
left, right = 0, num
while left <= right:
mid = (left + right) // 2
square = mid * mid
if square < num:
left = mid + 1
elif square > num:
right = mid - 1
else:
return True
return False
时间复杂度:O(logn),其中 n 为正整数num的最大值。
空间复杂度:O(1)。
另外,还有一种方法,叫做“牛顿迭代法”。恕我直言,更像是在搞数学,真要搞算法,还得是二分查找。