パッケージy2019.Algorithm.dynamicprogramming.medium; / ** * @ProjectName:カッター点 * @Package:y2019.Algorithm.dynamicprogramming.medium * @ClassName:NumDecodings * @Author:xiaof 91デコード方法:* @description * AZからの文字を含むメッセージは、にエンコードされています次のマッピング用い番号: * - > 1 *「」 *「B」 - > 2 * ... *「Z」 - > 26 *数字だけを含有する非空の文字列が与えられるが、する方法の合計数を決定しますそれをデコードします。 * *例1: * *入力: "12" *出力:2 *説明:それは、 "AB"としてデコードすることができ *例2: * *入力: "226" *出力:. 3 *説明:それは"BZ"としてデコードすることができ、 "VF"(22である6)(26 2)、または"BBF"(2 2. 6)。 * @Date:8分の2019 / 8時54分15 * @Version:1.0 * / パブリック クラスNumDecodings { 公共 のint 溶液(文字列s){ IF(S == NULL || s.equals( "")||(s.length()== 1 &&。 s.equals(「0」))){ 戻り 0 ; } // 我々は最初の2文字までの文字列の合計を使用することができることを見出し、両文字の数は、26 26ジョブ以下である // 我々は、次に第一の電流組成を復号化することが可能な文字の数を取得しなければならない送信することができる分割することができる // DP [N-] DP = [1-N-] + {IF(2num <時間に2つの文字を追加することなく、デコードされたデジタル数が構成されてもよいよう= 26} {DP [N-2}最後の2桁を満たします INT DP [] =新しい新しい INT [s.length()+ 1 ]; DPは、[ 0] = 1; DP = 1 [1] ; char型 [] SC = s.toCharArray(); のため(int型 I = 2、I <dp.length ; ++ I){ // iがSのi番目の文字を識別するために、最初取るだけでなく、文字は0にすることができないかを決定するために、または単一の文字を使用することはできません IF(SC [I - 1] =「0」!){ DP [I] = DP [I - 1 ]; } //を決定する場合に除去位置番号2 のint L = I - 2 ; int型値= Integer.valueOf(s.substring(L、I)); IF(値<図26は、&&値=> 0 ){ DP [I]+ = DP [I - 2 ]。 } } 戻りDP [s.length()]。 } パブリック 静的 ボイドメイン(文字列[]引数){ 文字列S = "12" 。 文字列s2 = "226" ; 文字列S3 = "10" ; NumDecodingsのFuc = 新しいNumDecodings(); fuc.solution(S3)。 } }
パッケージy2019.Algorithm.dynamicprogramming.medium; 輸入はjava.util.List; / ** * @ProjectName:カッター点 * @Package:y2019.Algorithm.dynamicprogramming.medium * @ClassName:MinimumTotal * @Author:xiaof * @description:120トライアングル 三角形を考える*、上から最小パス和を見つけます下へ。各ステップは、あなたの下の行に隣接する番号に移動することができます。 * *たとえば、次の三角形所与 * * [ * [2]、 * [3,4]、 * [6,5,7]、 * [4,1,8,3] *] *最小経路和上から下に(すなわち、2 + 3 + 5 + 1 = 11)11です。 2019 * @Date / 8月15日8時54分 * @Version:1.0 * / パブリック クラスMinimumTotal { 公共の int型のソリューション(一覧<一覧<整数>> トライアングル){ // 私たちは下から上、トラバーサルを逆にこの問題最小トラバース //は最短経路のk i番目の行はminpath [K]である知ることができる[I] =分{minpath [K + 1] [i]は、minpath [K + 1] [I + 1 ]トライアングル} + [K] [I] INT [] [] = minpath 新しい新しい INT [triangle.size()+ 1] [triangle.size()+ 1。。]; のための(int型の行= triangle.size() - 1。 ;行> = 0; - 行){ // データを介してカラム のための(int型の列= 0;カラム<triangle.get(行).size(); ++カラム){ minpath [行] [列]= Math.min(minpath [行+ 1] [列]、minpath [行+ 1] [カラム+ 1])+ triangle.get(行)に.get(列); } } 戻り minpath [0] [0 ]。 } }
パッケージy2019.Algorithm.dynamicprogramming.medium; 輸入y2019.Algorithm.common.TreeNode。 輸入はjava.util.ArrayList; 輸入はjava.util.List; / ** * @ProjectName:カッター点 * @Package:y2019.Algorithm.dynamicprogramming.medium * @ClassName:GenerateTrees * @Author:xiaof * @description:95ユニークなバイナリ検索ツリーII * * nは整数を考えるには、生成すべての構造的にユニークなBSTの(二分探索木)その店は1つの... N値。 * *例: * *入力:3 *出力: * [ *、NULL、1、[3,2]、 * [3,2、NULL、1] * [3,1、NULL、NULL、2]、 * [2,1,3]、 * [1、NULL、2、NULL、3] *] *説明: *上記の出力を以下に示しています5ユニークBSTに対応する: * * 1 3 3 2 1 * \ / / / \ \ * 3 2 1 3 2 * / / \ \ * 2 1 2 3 * * @Date:2019年8月15日午前8時54 * @Version:1.0 * / パブリック クラスGenerateTrees { パブリックリスト<ツリーノード>溶液(int型N){ 場合(N == 0)を返す 新しい > <のArrayListを()。 リターン backtruack(1 、N-); } // それらはすべての可能性は、再帰的にすべての結果を必要とするため、 公衆リスト<ツリーノード> backtruack(int型 Lを、INT R&LT){ // 我々は動作する必要がR&LT> L-の範囲の 一覧<ツリーノード> = RES 新しい新規のArrayList <> (); // L>がRを超え、その後、直接空のセットを返す場合、この間隔は不可能であるため、組成ツリー IF(L> R&LT ){ res.add(NULL ); 戻りRESを; } // lは== Rそれはツリーのルートとして現在のノードに返す場合、 IF(== LのR&LT){ res.add(新しい新ツリーノード(L))は、 戻り、RESを } // 1-> R、すべてのノードをトラバース、合成ルートノードを順次ケースを残り 一覧<ツリーノード> leftlist、rightlist; のため(int型私は= L、I <= R ; ++ i)が{ // 値のi番目のルートとしてそれを回すとき leftlist backtruack =(L、I - 1。); rightlist = backtruackは、(i + 1 、R&LT); // 最後の値も両方結合 のために(ツリーノードlefttree:leftlist){ ため(ツリーノードrighttree:rightlist){ ツリーノードルート = 新しい新しいツリーノード(I); //現在のルートノード root.left = lefttree。 root.right = righttree。 res.add(ルート)。 } } } 戻りRES。 } }