アルゴリズム - leetcode 292ニムゲーム

アルゴリズム - leetcode 292ニムゲーム

 ディアンタイトル

あなたとあなたの友人、ニムのゲームをプレイする二人:テーブルの上に石の山を、あなたがターンするたびに取り除か1 - 3 石を。人物の削除された最後の石は勝者です。あなただけみてください。

あなたは賢い人です、すべてのステップは、最適なソリューションです。石の数を考えると、あなたはゲームに勝つことができるかどうかを判断する機能を記述します。


入力:4 
出力:偽の 
説明:ヒープがある場合は4 石を、そしてあなたが勝つことは決してありません。
     あなたは離れて取るかどうかので、1つのブロック2ブロックまたは3石を、最後の石は、常にあなたの友人を得るためになります行きます。

 

二ディアンアイデア

  再帰を - 解決するために暴力を使用するには、1)最初の試み

  

クラスソリューション{
     パブリック ブール canWinNim(int型N){
         場合(N <= 0 ){
             戻り 
        } 
        場合(N <= 3 ){
             戻り 
        } 
        もし {(friendCanWinNim(N-1)!)// 拿1块
            戻り 
        } 
        もし {(friendCanWinNim(N-2)!)// 拿2块
            戻り 
        } 
        場合(!friendCanWinNim(N-3)){ // 拿3块
            返す ; 
        } 
        戻り falseに; 
    } 

    // 友人が勝つことができるかどうか、友人が取る
    プライベート ブール friendCanWinNimを(int型N-){
         IF(N - <= 0 ){
             リターン falseに; 
        } 
        IF(N - <= 3。){
             リターン trueに; 
        } 
        IF(! canWinNim(1-N-)){ // 取得
            リターン trueにする; 
        } 
        IF(!canWinNim(2-N-)){ // 2つの取得
            リターン trueにする; 
        } 
        IF(canWinNim(3-N-)!。){ // 取得3つの
            リターン をtrueに; 
        } 
        リターン falseに; 
    } 
}

 

 

  2)タイムアウト現象キャッシュ中間結果

クラスのソリューション{
    地図<整数、ブール> このresultMap = 新しい HashMapの<整数、ブール>(); // 结果
    
    パブリック ブール canWinNim(int型N){
         場合(N <= 0 ){
             戻り 
        } 
        場合(N <= 3 ){
             戻り 
        } 
        場合(結果[N] =!ヌル){
             返す結果を[N]。
        } 

        ブール結果= もし(!friendCanWinNim(N-1)){ // 拿1块 
            結果= 
            resultMap.put(N、結果)。戻り値の結果; 
        } 
        であれば(friendCanWinNim(N-2)!){ // 拿2块 
            結果= resultMap.put(N、結果)。戻り値の結果; 
        } 
        であれば(friendCanWinNim(N-3)!){ // 拿3块 
            結果= resultMap.put(N、結果)。戻り値の結果; 
        } 

        結果 = resultMap.put(N-、結果); 戻り値の結果; 
    } 

    // 友人は友人が勝つことができるかどうか、取る
    プライベート ブール friendCanWinNim(int型N-){
         IF(N - <= 0 ){
             リターン falseに; 
        } 
        IF(N - <= 3 ){
             戻り trueに; 
        } 
        IF(!。canWinNimを(1-N-)){ // 取得
            リターン trueにする; 
        } 
        IF(canWinNim)(2-N-!){ // 2つの取得
            リターン trueにする; 
        } 
        IF(canWinNim(3-N-)!。){ // 取得3つの
            リターン をtrueに; 
        } 
        リターン falseに; 
    } 
}

 

 

  3)再帰大きすぎる、スタックオーバーフロー例外が発生し、)動的プログラミングと同様(再帰ループのために変更され

 

クラスのソリューション{ 
    地図 <整数、ブール>このresultMap = 新しい HashMapの<整数、ブール>(); // 缓存先手的结果
    パブリック ブール canWinNim(int型N){
        場合(N <= 0 ){
             戻り 
        } 
        // 初始化 
        resultMap.put(1、)。
        resultMap.put( 2、)。
        resultMap.put( 3、)。

        ブール結果1、結果2、result3。
        int型 I ++; iが<= N; iは、4 =){
             // 拿1块 
            結果1 = resultMap.get(I-1 )。

            // 拿2块 
            結果2 = resultMap.get(I-2 )。

            // 拿3块 
            result3 = resultMap.get(I-3 )。

            もし(!!!結果1 || ||結果2 result3){ 
                resultMap.put(I、真の); 
            } { 
                resultMap.put(I、)。
            } 

       のSystem.out.println(I + " - >" + resultMap.get(I))。 }
戻りresultMap.get(n)を、 } }

 

  4)まだタイムアウト、(印刷中間結果がここで見つけることができ法則を説明するために見えたT_Tその他)

クラスのソリューション{
     パブリック ブール canWinNim(int型N-){
         // 法令のタイトル
         @ 3 + 1の出力がされます
        返す(3 + 1)= 0のn%を!; 
    } 
}

 

おすすめ

転載: www.cnblogs.com/timfruit/p/11616262.html