如果能夠確定 a 的值,那便可以透過計算 b=c−a2 來確定 b 的值。因此,可以從 a=0 開始 枚舉(Enumeration) ,直到 a2≤c 為止,計算 b 的值,檢查是否存在整數解滿足 a2+b2=c 的條件。
檢查是否滿足條件時,可以檢查 b 是否為整數,也可以透過計算 a2+b2 是否等於 c 來判斷,但前者的計算量較小。
複雜度分析
時間複雜度:O(c),枚舉 a 的範圍為 [0,c]。
空間複雜度:O(1)。
1 2 3 4 5 6 7 8
classSolution: defjudgeSquareSum(self, c: int) -> bool: for x inrange(int(c**0.5)+1): # 也可以用 double y,然後判斷 y == int(y) y = int((c - x**2)**0.5) if x ** 2 + y ** 2 == c: returnTrue returnFalse
1 2 3 4 5 6 7 8 9 10 11 12
classSolution { public: booljudgeSquareSum(int c){ for (LL x = 0; x * x <= c; x++){ double y = sqrt(c - x * x); if (y == (int)y){ returntrue; } } returnfalse; } };
初始化兩個指標 a 和 b ,分別指向範圍 [0,c] 的兩端,並根據目前指向的值的平方和與 c 的大小關係調整指針的位置。
如果 a2+b2=c ,則返回 true ,表示找到解。
如果 a2+b2<c ,則表示目前的和太小,需要增加和,移動 a 指針。
如果 a2+b2>c ,則表示目前的和太大,需要減少和,移動 b 指針。
重複上述步驟,直到 a>b 為止,表示沒有找到解,返回 false 。
複雜度分析
時間複雜度:O(c),在範圍 [0,c] 內移動兩個指針。
時間複雜度:O(1)。
1 2 3 4 5 6 7 8 9 10 11 12
classSolution: defjudgeSquareSum(self, c: int) -> bool: left, right = 0, int(c**0.5) while left <= right: cur = left**2 + right**2 if cur == c: returnTrue elif cur < c: # 太小 left += 1 else: # 太大 right -= 1 returnFalse
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
classSolution { public: booljudgeSquareSum(int c){ LL l = 0, r = sqrt(c); while (l <= r){ LL cur = l * l + r * r; if (cur == c){ returntrue; } elseif (cur > c){ r--; } else { l++; } } returnfalse; } };
寫在最後
Cover photo is generated by @ゴリラの素材屋さん, thanks for their work!