ノートデータ構造とアルゴリズムの部分安全プランを証明します

2.3.4ツリー

トラバース:シーケンスの後幅前に。

バイナリツリーの例外:バイナリ検索ツリー、ヒープ(最大値と最小ヒープヒープ、最も値を探して)、赤黒木(C ++ STLデータの多くこの実装の結果に基づいています)。

7バイナリ再建問題:再帰、4つのサイト。

クラスLinuxidc {
パブリック:
    のTreeNode * reConstructBinaryTree(ベクトル<整数>前、ベクトル<整数> VIN){
        場合(pre.size()= vin.size()|| vin.size()== 0!)戻りnullptr;
        復帰構築物(0、pre.size() - 1,0、vin.size() - 1、予め、VIN)。
    }
   
    ツリーノード*構築物(INT事前開始、INT PREEND、INT vinstart、INT vinend、CONSTベクトル<整数>&プリ、CONSTベクトル<整数>&VIN){
        IF(事前開始> PREEND)戻りnullptr。
        ツリーノード*ルート=新しいツリーノード(プレ[開始前])。
        (; I <= vinend; I ++は、I = vinstartをINT)のための
            (PRE [事前開始] == VIN [I]){場合
                root->左=(事前開始+ 1、事前開始+ I-vinstart、vinstart、I-1を構築、プリ、VIN)。
                root->右=構築物(事前開始+ I-vinstart + 1、PREEND、I + 1、vinend、予め、VIN)。
                ブレーク;
            }
        ルートを返します。
    }
}。

次の質問8ノードのバイナリツリー

クラスLinuxidc {
パブリック:
    TreeLinkNode * GetNextの(TreeLinkNode * PNODE)
    {
        IF(PNODE == nullptr)戻りnullptr。
        (もし!pNode->右= nullptr){
            PNODE = pNode->右;
            一方、(!pNode->左= nullptr){
                PNODE = pNode->左。
            }
            PNODEを返します。
        }
        他{
            (pNode->次==のnullptr)もし
                戻りnullptr。
            他{
                IF(PNODE == pNode->ネクスト>左)
                    pNode->次を返します。
                他の{
                    しばらく(pNode->次の!= nullptr){
                        もし(PNODE == pNode->ネクスト>左)
                            を返すpNode->次。
                        PNODE = pNode->次。
                    }
                    nullptrを返します。
                }
            }
        }
    }
}。

2.3.5スタックとキュー

9 - タイトルキュー2つのスタック:挿入するための1、削除のために、また、空の判定動作、各挿入/データ・スタックがあるだけ後の操作を削除します。

2.4アルゴリズムとデータ構造

再帰/サイクル、ソート/検索、経路探索(バックトラック)、最適解(動的プログラミング)、貪欲ビット演算(AND、OR、XOR、左シフト)

2.4.1および再帰ループ

インタビュアーは、再帰の使用を必要としない場合は、時間と再帰呼び出しスタックオーバーフローの効率の問題があります。

そのタイトル証書10-フィボナッチ数列:再帰低効率、ループO(N)の使用は、問題を再帰O(LOGN)、カエルジャンプとチェック柄を使用している数式を使用することができます。

2.4.2検索とソート

シーケンシャル検索、バイナリ、ハッシュテーブルの検索、バイナリ・ソートツリー

スワップ機能を交換し、乱数を再帰速い行に行われます。

ACのインタビュアー:どのようなデータの並べ替え、データの量を聞いて、補助スペースの数は、使用することができますか?クリアシーン

アレイタイトルの回転11-最小数:O(LOGN)とO(n)は、2つの点を使用して、しかし、2つのサイトの要素が等しい場合、内部逐次探索が行われるべきで、例えば、特別な治療が存在しなければなりません。

クラスLinuxidc {
パブリック:
    INT minNumberInRotateArray(ベクトル<整数> rotateArray){
        IF(rotateArray.size()== 0)戻り0;
        INT低= 0、ハイ= rotateArray.size() - 1、ミッド=(低+高)/ 2。
        IF(rotateArray [低] <rotateArray [高])を返すrotateArray [低]。
        場合(高い<2)rotateArray [高]を返します。
        一方、(!低=ハイ-1){
            IF(rotateArray [低] <rotateArray [高])rotateArray [低]を返します。
            (rotateArray [低] == rotateArray [中間] && rotateArray [中間] == rotateArray [高]){もし
                INT分= rotateArray [低]。
                以下のために(INT I =低+ 1; iは<高=、iは++)
                    場合(MIN> rotateArray [I])
                        分= rotateArray [I]。
                分を返します。
            }
            IF(rotateArray [低]> rotateArray [中間]){
                //ロー=ロー+ 1。
                高い=半ば;
                半ば=(ハイロー+)/ 2。
            }
            IF(rotateArray [高] <rotateArray [中間]){
                低い=ミッド。
                半ば=(ハイロー+)/ 2。
            }
        }
        rotateArray [低+ 1]を返します。
    }
}。

2.4.3バックトラック

再帰的に実装適しているのは、実際には、また、スタックを使用することができます。

ロボット動作計画問題13 - :あなたは、2つの格子を横断見つけることができるという考えは、我々はまだ探しにバックを使用し、到達し、後で間違っていることが判明することはできません

クラスLinuxidc {
パブリック:
    INT movingCount(INT閾値、INT行、INT colsの)
    {
        IF(閾値<= 0 ||行<= 0 || COLS <= 0)戻り0;
        BOOL *新しいBOOL [行* colsの] =訪問しました。
        以下のために(;私は行* colsのを<; I = 0 int型私は++)が
            訪れた[I] =偽;
        int型のres =同様にgetCount(行、colsの、0,0、しきい値、訪問しました)。
        []訪問を削除します。
        解像度を返します。
    }
    INT同様にgetCount(INT行、INT colsの、int型の列、int型COL、INT閾値、BOOL *訪問){
        int型のカウント= 0;
        IF(!訪問[行* colsの+ COL] &&(getSum(行、列)<=閾値)&&行> = 0 && COL> = 0 &&行<行&& COL <COLS){
            訪問[*行をCOLS + COL]は真=。
            カウント= 1 +同様にgetCount(行、COLS、行1、COL、閾値は、訪問)+同様にgetCount(行、COLS、行+ 1、COL、閾値は、訪問)+同様にgetCount(行、COLS、行、COL-1、閾値、訪問)+同様にgetCount(行、COLS、行、列+ 1、閾値は、訪問しました)。
        }
        カウントを返します。
    }
    INT getSum(INT行、INT colsの){
        int型の和= 0。
        一方、(行> 0 || COLS> 0){
            合計+ =(行%10の+ COLS 10%)。
            行/ = 10。
            COLS / = 10。
        }
        の和を返します。
    }
}。

2.4.4動的プログラミングと貪欲法

規制措置:

  • 多くのサブ問題に分けます。
  • 全体の問題は、サブ問題に依存します
  • 部分問題だけでなく、小さな重なり合う部分問題間

分析から下、下から上(算出された第1の最適解配列およびダウン格納されている小さな問題)を解決します

質問 - ロープを切断:動的プログラミング(2サイクルをO(N側))を用いて行われ、貪欲法(正当化するために、1)時間と空間(O)

2.4.5ビット演算

左AND、OR、XOR、シフト(乗算および除算より高い計算効率)。

それは負の注意が右にシフトしている場合、最大1で、かつ操作と0に右端の1の元の整数バイナリ表現に相当する結果の数、バイナリ多くの質問の後に行うために、整数1ビットを引いた後、我々は、このルーチンを使用することができます。

タイトル - 2進数の1の数

クラスLinuxidc {
パブリック:
    INT NumberOf1(INT N){
        int型のカウント= 0;
        (N){一方
            ++数えます。
            N = N・(N-1)。
        }
        カウントを返します。
    }
}。

おすすめ

転載: www.linuxidc.com/Linux/2019-06/158956.htm