タイトル説明
いくつかのタグエンベロープの幅と高さを考えると、(H、W)整数形の幅と高さが表示されます。他のエンベロープ大きな封筒よりも幅と高さ、この時間は、あなたが同じロシアの人形のような別の封筒、中封筒を置くことができるとき。 (内部の別の封筒に封筒を置くことができる)のグループ「ロシア人形」エンベロープを形成することができるようにどのように多くの封筒まで計算します。 注: いいえ回転封筒を。 例: 入力:封筒 = [5,4]、[6,4]、[6,7である]、[2,3 ] 出力: 3 説明:エンベロープの最大数 3の組み合わせ:[2、 3] => [5,4] => [6,7 ]。 出典:ボタン(LeetCode)滞在 HTTPS:リンク// leetcode-cn.com/problems/russian-doll-envelopes すべてのネットワークからの控除が著作権を保有。商業転載は許可公式、非商用の転載は、ソースを明記してくださいお問い合わせください。
問題解決のアイデア:
第1の幅 w
その場合、昇順に w
同一の高さに応じて、 h
降順。結局のところ h
アレイは、アレイは、長さがLIS(最長増加シーケンス)で算出される答えです。
コード:
インポートjava.util.Arrays; インポートはjava.util.Comparator; クラスソリューション{ / ** これらはW同じである場合*最初の昇順ソートの幅w、高さhは、降順にソートされています。 アレイなどのすべての時間*後、アレイは長さがLIS(最長増加シーケンス)で算出される答えです。 * @パラメータ封筒 * @return * / パブリック INT maxEnvelopes(INT [] []封筒){ int型 N- = envelopes.length; // 幅昇順に、同じ幅であれば、下降高さプレス は、Arrays.sort(封筒、新しい新しいコンパレータ< 整数 []> (){ 公共の intが(比較INTは []、int型[] B){ 戻り [0] == B [0] Bの- [1]:?[0] - B [0 [1] ]; } }); // ためアレイの高さが見つけるLISの INT []高さ= 新しい新しい INT [N-]; のため(int型 I = 0; I ++は、I <N - ) 高[I] =封筒[I] [1 ]; 戻りlengthOfLIS(高さ); } / * * *動的計画+バイナリサーチ最長増加部分列 *動的プログラミング+二分法 * @paramのNUMS * @return * / パブリック INT lengthOfLIS(INT [] NUMS){ INT [] DP = 新しい新しい INT [nums.length]; // 長さ値の代表的なサブシーケンスのDP [i]は、I、シーケンスの最後に、この要素の値です。 int型の最大値= 0; // 最長のサブシーケンスの長さ のために(INT NUM:NUMS){ int型 J =、I = 0 マックス; ながら(私は< J)を{ INT、M =(Iは、J + 1)/ 2 ; IF(DP [M] < NUM) I = M + 1。; そう J = M。 } DP [I] = NUM; // 二分法は、第1の被覆NUMのより大きな値を見つける (+ I. 1、MAX)最大= Math.max; //は、最大長を更新 } 返すmaxは; } }