質問
正の整数で指定された N、(例えば、完全な正方形の数の最小数を見つける 1, 4, 9, 16, ...
ために)その和 N。
例1:
入力:N =12
出力:3 説明:12 = 4 + 4 + 4.
例2:
入力:N =13
出力:2 説明:13 = 4 + 9.
方法の一つ:動的計画
時間計算量:O(N ^ 2)
1を得るために、動的プログラミングを考えることは容易である2、3、...、n-1の最小二乗値の数を取得し、その後最小二乗N値の数です。ダイナミックな伝達方程式は次のようになります。
F(I)=分([範囲のkのF [K] + F [IK](1、I)])
クラスソリューション: DEF numSquares(自己、N:整数) - > INT: インポート数学 F = [0] f.append( 1 ) 用の I における範囲(2、N + 1 ): もし I == INT((数学。 SQRT(I)))** 2 : f.append( 1 ) 他: f.append(MIN([F [K] + F [IK] のための K での範囲(1 、I)])) リターン N [F ]
TLE、時間計算量が高すぎる、588分の502テストケースが渡されます。
方法2:動的プログラミング、平方根剪定
時間計算量:O(n個の*のSQRT(N))
方法の一般的な考え方は良好であるが、1、2、3、...、I-1のすべてのO(N)と、この工程で得られた値が、実際には必要ではないが、1、2、3列挙する列挙しますペアの値のみがライン上で完璧な正方形を列挙する必要がある間、...、I-1、それだけで完全な方形を列挙するように変更することができます。
クラスソリューション: DEF numSquares(自己、N:整数) - > INT: F = [N] *(N + 1 ) [0]、F = 0 F [ 1] = 1 のための I における範囲(2、N + 1 ) : J = 1 ながら jは* jの<= I: F [I] =分([I]、F [IJの*のJ] +1 F ) J + = 1つの 戻り F [-1]
方法3:BFS
時間計算量:O(SQRT(N)^ k)は(最悪の場合は4であり、平均の不確実性は、4つの公知の方法をK)
例として、13:
方法4:四平方定理
時間の複雑さ:
参考: