件名の説明:
方法の一つ:動的計画
:タイムアウト
クラスのソリューション: DEF numSquares(自己、N:整数) - > int型: DP = [フロート(" INF ")] *(N + 1 ) DP [0] = 0 のため、I で範囲(1、N + 1 ) のための J での範囲(1、INT(I ** 0.5)+ 1 ): DP [I] =分(DP [I]、DP [I - jは*のJ] + 1 ) 戻り DP [N]
2:
クラスのソリューション: _dp = [0] DEF numSquares(自己、N): DP = self._dp 一方 LEN(DP)<= N: DP + =分(DP [-i * I] のための I における + 1の範囲(1、INT(LEN(DP)** 0.5 + 1))) 、 戻り [n]はDP
方法II; BFS
クラスソリューション: DEF numSquares(自己、N:整数) - > INT: からコレクションインポート両端キューの 場合のn == 1 又は N == 0:リターンN であれば、N ** 0.5%1 == 0:リターン 1 condidates =組(私は* ため、I で範囲(1、INT(N ** 0.5)+1 )) 尾 = 両端キュー([N]) ステップ = 0 中のキュー: ステップ + = 1 、L = LEN(キュー) のための _ 中範囲(L): CUR = queue.pop() のために X でcondidates。 TMP = CUR - X なら TMP でcondidates: 戻りステップ+ 1 であれば TMP> 0: queue.appendleft(TMP)
方法3:ラグランジュ4つの平方数と定理
クラスソリューション: DEF numSquares(自己、N:整数) - > INT: ながら N%4 == 0: N / = 4 であれば、n個の8%== 7 : リターン 4 = 0 一方 ** 2 <= N: B = INT((N - ** 2)** 0.5 ) であれば ** 2 + B ** 2 == N: 戻り BOOL(A)+ BOOL(B)+ = 1 復帰 3