题目描述:
给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。
示例:
- 输入:num = 16
输出:true - 输入:num = 14
输出:false
思路:
一、 暴力求解:
从0-num都试一次,如果找到x * x = num就返回true,否则false。
如果n大时间复杂度很高。
二、二分查找:
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
注意,如果num很大则前几次取一半的时候也很大,再平方,值可能会超界 ,所以可以使用square/num的方式与num进行比较:
class Solution:
def isPerfectSquare(self, num: int) -> bool:
if num == 0 or num == 1:
return True
left, right = 0, num
while left <= right:
mid = (left + right) // 2
square = mid * mid
if mid < num/mid:
left = mid + 1
elif mid > num/mid:
right = mid - 1
else:
return True
return False
时间复杂度:O(logn),其中 n 为正整数 num 的最大值。
空间复杂度:O(1)。
注意二分查找一定要记住代码的模板。
本题也可以使用牛顿法进行解决,具体的思路和代码详见:
牛顿法
class Solution:
def isPerfectSquare(self, num: int) -> bool:
x0 = num
while True:
x1 = (x0 + num / x0) / 2
if x0 - x1 < 1e-6:
break
x0 = x1
x0 = int(x0)
return x0 * x0 == num
牛顿法的思想就是找到一个解需要满足的方程,每次找到切线,利用切线的根来不断的逼近。