while n & 3 == 0: #n%4==0 n >>= 2 if n & 7 == 7: #n%8 == 7 return4
sqrt_n = int(math.sqrt(n)) for i inrange(1, sqrt_n + 1): if is_square(n - i * i): return2
return3
BFS
广度优先遍历的思想是将小于等于n的每个完全平方数都看作是图中的一个节点,当且仅当满足j = i + 完全平方数时,i节点与j节点相连。从0节点开始做广度优先遍历,当遍历到节点n时,说明我们遍历过的节点和为n,此时遍历步数就是最终结果。
大佬的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12
classSolution: defnumSquares(self, n: int) -> int: if n <= 0: return0 perfect_squres = [i ** 2for i inrange(1, int(n ** 0.5) + 1)] d, q, nq = 1, {n}, set() while q: for node in q: for square in perfect_squres: if node == square: return d if node < square: break nq.add(node - square) d, q, nq = d + 1, nq, set()