跳至主要內容

0633. 平方数之和

ITCharge大约 1 分钟

0633. 平方数之和open in new window

  • 标签:数学、双指针、二分查找
  • 难度:中等

题目链接

题目大意

给定一个非负整数 c,判断是否存在两个整数 a 和 b,使得 a2+b2=ca^2 + b^2 = c,如果存在则返回 True,不存在返回 False。

解题思路

最直接的办法就是枚举 a、b 所有可能。这样遍历下来的时间复杂度为 O(c2)O(c^2)。但是没必要进行二重遍历。可以只遍历 a,然后去判断 cb2\sqrt{c - b^2} 是否为整数,并且 a 只需遍历到 c\sqrt{c} 即可,时间复杂度为 O(c)O(\sqrt{c})

另一种方法是双指针。定义两个指针 left,right 分别指向 0 和 c\sqrt{c}。判断 left2+right2left^2 + right^2 与 c 之间的关系。

  • 如果 a2+b2==ca^2 + b^2 == c,则返回 True。
  • 如果 a2+b2<ca^2 + b^2 < c,则将 a 值加一,继续查找。
  • 如果 a2+b2>ca^2 + b^2 > c,则将 b 值减一,继续查找。
  • a==ba == b 时,结束查找。如果此时仍没有找到满足 a2+b2==ca^2 + b^2 == c 的 a、b 值,则返回 False。

代码

class Solution:
    def judgeSquareSum(self, c: int) -> bool:
        a, b = 0, int(c ** 0.5)
        while a <= b:
            sum = a*a + b*b
            if sum == c:
                return True
            elif sum < c:
                a += 1
            else:
                b -= 1
        return False