题目:367. 有效的完全平方数
题目描述:
给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。
示例:
输入:16
输出:True
输入:14
输出:False
思路:
方法一:“暴力”
直接从1开始遍历,直到满足条件为止。(一般人应该不会这么干吧)时间复杂度是O(n),经检验超时,代码就不放了。
方法二:“任意一个平方数可以表示成这样的奇数序列和:1+3+5+7+…(2N−1)=N ^2"
代码:
class Solution:
def isPerfectSquare(self, num: int) -> bool:
i = 1
while num > 0:
num -= i
i += 2
return num == 0
方法二的时间复杂度是O(n^0.5),实测可以通过。
方法三:二分法(相当于对方法一的优化)
代码:
class Solution:
def isPerfectSquare(self, num: int) -> bool:
if num < 2:
return True
left, right = 1, num
while left < right:
x = (right + left)//2
if x * x == num:
return True
elif x * x > num:
right = x
else:
left = x + 1
return False
方法四:牛顿迭代法(数值分析中学过,可惜学过不会灵活使用)
牛顿迭代法是通过数值逼近,来求方程近似解的一种方法。思路感觉我讲不明白,就不写了。可以参考链接。
https://leetcode-cn.com/problems/valid-perfect-square/solution/ceng-ceng-di-jin-zhu-bu-zui-you-de-si-chong-jie-fa/
代码:
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
作者:LeetCode
链接:https://leetcode-cn.com/problems/valid-perfect-square/solution/you-xiao-de-wan-quan-ping-fang-shu-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。