↓快轉到主要內容
  1. LeetCode/

LeetCode 633: Sum of Square Numbers

·2 分鐘· ·
LeetCode Medium Two-Pointers Math Binary-Search
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: medium 第一次嘗試:2026-01-25

  • 提交紀錄:Wrong Answer ×3 → Accepted ×2

解題思路
#

找非負整數 a、b 使 a^2 + b^2 = c。

a 從 0、b 從 ⌊√c⌋ 開始對撞:

  • a^2 + b^2 > c:b 太大,b -= 1。
  • a^2 + b^2 < c:a 太小,a += 1。
  • 相等:找到了。

為什麼不會漏:每次排除的是「目前的 b 跟所有 >= a 的數都太大」或「目前的 a 跟所有 <= b 的數都太小」,跟 Two Sum II 的對撞指針一樣。

我的嘗試
#

三次 WA 都是邊界:

版本問題
第一版a 從 1 開始,漏掉 0。例如 c = 4 = 0^2 + 2^2、c = 0,都回傳 False
第二版a 從 0 開始,但條件是 a < b,漏掉 a == b。例如 c = 2 = 1^2 + 1^2,回傳 False;而且 b 從 c 開始,要走 O(c) 步
第三版b = c ** 0.5 是浮點數,平方回去有誤差。例如 c = 2:(√2)^2 算出來是 2.0000000000000004,大於 2,之後都對不上,回傳 False

改成 int(c ** 0.5) 就 AC 了。更穩的寫法是 math.isqrt,完全不經過浮點數。

正確解法
#

from math import isqrt

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

複雜度
#

時間 O(√c),空間 O(1)。

要特別避免的錯誤
#

  • 忘了 0 也是平方數。
  • 條件寫成 a < b,漏掉 a == b。
  • 用浮點數開根號後直接平方比較。

面試口說整理
#

我讓 a 從 0、b 從 √c 的整數部分開始對撞:平方和太大就讓 b 變小,太小就讓 a 變大,相等就找到。邊界要注意 0 也算、a 可以等於 b,開根號用 isqrt 避免浮點誤差。時間 O(√c)。

相關文章

LeetCode 2563: Count the Number of Fair Pairs
·2 分鐘
LeetCode Medium Two-Pointers Sorting Binary-Search Array
LeetCode 2563 解題筆記:把「和落在 [lower, upper]」拆成「和 <= upper」減「和 <= lower - 1」,每個都用排序後的對撞指針 O(n) 數
LeetCode 1498: Number of Subsequences That Satisfy the Given Sum Condition
·2 分鐘
LeetCode Medium Two-Pointers Sorting Binary-Search Array
LeetCode 1498 解題筆記:子序列只看最小值和最大值,排序後順序無關;固定最小值 nums[left],中間的元素任意選,共 2^(right - left) 種
LeetCode 1712: Ways to Split Array Into Three Subarrays
·2 分鐘
LeetCode Medium Binary-Search Prefix-Sum Two-Pointers
LeetCode 1712 解題筆記:固定第一刀,第二刀的合法範圍用兩次 bisect 或兩個單調指針找出來
LeetCode 825: Friends Of Appropriate Ages
·2 分鐘
LeetCode Medium Two-Pointers Sorting Binary-Search Array
LeetCode 825 解題筆記:排序後,每個人能送出邀請的對象是年齡落在 (0.5 × age + 7, age] 的一段區間,用兩個同向指針維護區間再扣掉自己
LeetCode 611: Valid Triangle Number
·1 分鐘
LeetCode Medium Array Two-Pointers Binary-Search Greedy
LeetCode 611 解題筆記:排序後固定最長邊 k,左右指針找兩短邊:和夠大時中間的都可以,一次加 j - i 個
LeetCode 189: Rotate Array
·1 分鐘
LeetCode Medium Array Math Two-Pointers
LeetCode 189 解題筆記:先 k %= n,再用三次反轉:整個反轉、前 k 個反轉、後 n - k 個反轉;O(1) 額外空間