例:
入力:[10,9,2,5,3,7,101,18]
出力:4 説明:最長シーケンスが増加している[2,3,7,101],
その長さを4
。
インターネットからのコードの一部を見つけるために(私はC ++、Javaバージョンから変更)、原作者は簡潔に非常に明確に説明しています。私は再び書き込むことが一般的なアルゴリズムの質問に自分のアイデアを読みますが、このアルゴリズムのコードは本当に簡単ですが、素晴らしいアイデア、それはもはや再び自分自身を書きません。
クラス解決{ パブリック: INT lengthOfLIS(INT * NUMS){ / * * DP [I] :. I + 1のすべての長さ増加サブ配列、その配列の仮数の最小 定義DPアレイによっては、増分配列でなければなりません。最長MAXL増分シーケンスの長さで表すことができる 配列反復、順次決定NUMの対応する数のそれぞれが挿入さDPアレイ場所: 1 NUM> DP [MAXL]は、それが増加する配列よりも、すべての既知のNUMを表します仮数は、追加NUMのDPの大きい アレイの端部、及び最長の増加系列長プラスMAXL。1 2 DP [-I。1] <NUM <DP = [I]は、唯一の対応するDPを更新する[I] * * / INT MAXL = 0 ; int型 N- = はsizeof(NUMS)/ はsizeof(INT ); INT* DP = 新しい新しい INT [N- + 5。]; のため(int型 I = 0、I <N - 、Iは++ ){ int型 NUMは= [I] NUMSを; // バイナリ検索、また、binary_searchライブラリ関数を呼び出すことができ 、INT =ロー0、 =高MAXL; 一方(低< 高){ int型 MID =(ハイ+ローの)/ 2 ; IF(DP [MID] < NUM) 低 = MID + 1。; 他の 高= 半ば; } [低] DP = NUM。 もし(低== MAXL) MAXL ++ ; } 戻りMAXLと、 } }。