Valid Perfect Square,LeetCode,367

题目描述:

给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 true,否则返回 false

示例:

输入: 16 输出: true

输入: 14 输出: false

解题思路:

判断一个数是否为完全平方数,可以通过以下几种方法:

方法一:直接开平方

  1. 计算平方根:使用 sqrt 函数计算 num 的平方根。
  2. 判断平方根是否为整数:如果平方根的整数部分平方后等于 num,则 num 是完全平方数。

代码实现:

import math

def isPerfectSquare(num): sqrt_num = math.sqrt(num) return int(sqrt_num) ** 2 == num

示例

print(isPerfectSquare(16)) # 输出: true print(isPerfectSquare(14)) # 输出: false

方法二:二分查找

  1. 初始化边界:设置左边界 left 为 1,右边界 rightnum
  2. 二分查找:在 leftright 之间进行二分查找,计算中间值 mid,判断 mid * midnum 的关系。
    • 如果 mid * mid == num,则 num 是完全平方数。
    • 如果 mid * mid < num,则调整左边界 left = mid + 1
    • 如果 mid * mid > num,则调整右边界 right = mid - 1
  3. 结束条件:当 left 超过 right 时,结束循环。

代码实现:

def isPerfectSquare(num): left, right = 1, num while left <= right: mid = (left + right) // 2 if mid mid == num: return True elif mid mid < num: left = mid + 1 else: right = mid - 1 return False

示例

print(isPerfectSquare(16)) # 输出: true print(isPerfectSquare(14)) # 输出: false

方法三:牛顿迭代法

  1. 初始化:设置初始值 r = num
  2. 迭代计算:使用牛顿迭代公式 r = (r + num / r) / 2,直到 r * rnum 的差值小于等于 1。
  3. 判断结果:如果 r * r == num,则 num 是完全平方数。

代码实现:

def isPerfectSquare(num): r = num while r r > num: r = (r + num // r) // 2 return r r == num

示例

print(isPerfectSquare(16)) # 输出: true print(isPerfectSquare(14)) # 输出: false

总结:

  • 直接开平方 方法简单直观,但依赖 sqrt 函数,可能存在精度问题。
  • 二分查找 方法不依赖库函数,时间复杂度为 O(log n),适合大数处理。
  • 牛顿迭代法 方法效率高,迭代次数少,适合快速计算。

根据具体需求选择合适的方法即可。希望这些解答对你有所帮助!如果有更多问题,欢迎继续提问。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注