strobogrammatic数(逆さまに見た)180度回転させたときに同じに見える番号です。
長さのものであるすべてのstrobogrammatic番号を検索= N。
例えば、
n = 2のリターンを考えます ["11","69","88","96"]
。
いくつかの例を実行します
N = 0、NULL。
N = 1、[0,1]、[8]
N = 2、[11、69、88、96]
、N = 3、[101、609、808、906、
111、619、818、916、
181、689、888 、986]
N = 4、[1001 6009、8008、9006、
1111、6119、8118、9116、
1691、6699、8698、9696、
1881、6889、8888、9886、
1961、6969、8968、9966]
ブレーンストーミング:
所与のnについて、リスト内のその結果の各々は、以下を実行することによって生成されます。
長さnの結果の各々について- 2:
その左と右の1に1を加えます。
その左と右の9に6を追加します。
その左と右の8に8を追加します。
その左と右の6に9を追加します。
その左と右の0に0を追加します。(特別な場合:最終結果を構築する際に0がいずれかの末端に付加することができません)
再帰溶液:
ランタイム:Nに関して結果の数である3 * 2 ^(N-1)用のn> = 1、nが奇数です。
5 * 2 ^(N-2)は、n> = 2 N偶数であるため。
その実行時間は指数関数O(2 ^ n)があります。ソリューションの指数関数的な数があるので、それは最適です。
空間複雑:奇数のnに対して、3 *(2 ^(N-1)+ 2 ^(N-3)+ ......... + 1)O(2 ^ N)
nが偶数の場合と類似。
パブリック クラスソリューション{
公共の一覧<文字列> findStrobogrammatic(int型のn){
リスト <StringBuilderの> sbList = findRecursive(N、N)。
一覧 <文字列> ANS = 新しい ArrayListを<> ();
用(StringBuilderのSB:sbList){
ans.add(sb.toString())。
}
リターン歳;
}
プライベートリスト<のStringBuilder> findRecursive(int型 currLen、int型targetLen)
{
一覧 <StringBuilderの> R = 新しいのArrayList <のStringBuilder> ();
もし(currLen == 0 )
{
r.add(新しい StringBuilderの( "" ));
戻りR;
}
もし(currLen == 1 )
{
r.add(新しい StringBuilderの( "0" ));
r.add(新しい StringBuilderの( "1" ));
r.add(新しい StringBuilderの( "8" ));
戻りR;
}
一覧 <StringBuilderの>短い= findRecursive(currLen - 2 、targetLen)。
用(StringBuilderのSB:短いです)
{
もし(currLen!= targetLen)
{
r.add(新しい StringBuilderの( "0")APPEND(SB).append( "0"。 ));
}
r.add(新しい StringBuilderの( "1")のappend(SB).append( "1"。 ));
r.add(新規のStringBuilder( "6")アペンド(SB).append( "9" ));
r.add(新しい StringBuilderの( "8")APPEND(SB).append( "8"。 ));
r.add(新規のStringBuilder( "9")アペンド(SB).append( "6" ));
}
戻りR;
}
}
関連問題