题目
难度:★☆☆☆☆
类型:数组
给定一个非负整数 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
如有疑问或建议,欢迎评论区留言~