633. 平方数之和(Python)

题目

难度:★☆☆☆☆
类型:数组

给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c。

示例

示例1:
输入: 5
输出: True
解释: 1 * 1 + 2 * 2 = 5

示例2:
输入: 3
输出: False

解答

方案1:遍历

我们从小到大遍历从零开始到【输入数字c的平方根向上取整】的所有数字i,判断输入数字减去当前数字的平方(c-i**2)是否为完全平方数,如果遇到这样的情况,则输入数字是平方数之和,直接返回True,如果没有遇到,则返回False。

class Solution:
    def judgeSquareSum(self, c: int) -> bool:
        is_square = lambda n: not n ** 0.5 % 1      # 定义函数,判断一个数是不是平方数
        for i in range(int(c**0.5)+1):              # 遍历数字,注意范围
            if is_square(c-i**2):                   # 如果c-i^2是平方数
                return True                         # 返回True
        return False                                # 不满足平方数之和的条件

方案2:左右指针

定义一个从零开始到【输入数字c的平方根向上取整】的数组,定义左右指针(left和right),初始化为零和输入数字c的平方根向上取整,设定循环:

循环控制条件:左指针不能跑到右指针右边去;

循环操作:计算左右指针处数字的平方和,

判断:
(1)如果平方和等于目标值,说明目标值是某两数的平方和,返回True;
(2)如果平方和大于目标值,右指针左移,继续循环;
(3)如果平方和小于目标值,左指针右移,继续循环;

跳出循环后,说明没有两个数的平方和等于目标值,返回False。

class Solution:
    def judgeSquareSum(self, c: int) -> bool:
        left, right = 0, int(c**0.5)+1              # 定义左右指针
        while left <= right:                        # 如果左指针没有跑到右指针右边
            rst = left * left + right * right       # 计算平方和
            if rst == c:                            # 如果平方和恰好等于结果
                return True                         # 说明目标值c是平方和
            elif rst < c:                           # 如果当前平方比目标值小
                left += 1                           # 左指针右移
            elif rst > c:                           # 如果当前平方比目标值大
                right -= 1                          # 右指针左移
        return False                                # 没有找到,返回False

如有疑问或建议,欢迎评论区留言~

你可能感兴趣的:(633. 平方数之和(Python))