Cracking the Coding Interview, Fourth Editionには、次のような問題があります。
サーカスは、互いに肩の上に立つ人々からなる塔のルーチンを設計しています. 実用的および美的理由から、各人は、その下にいる人よりも背が低くて軽い必要があります. サーカスの各人の身長と体重を考えると,そのような塔にいる人の最大数を計算する方法を書いてください。
例: 入力 (ht, wt): (65, 100) (70, 150) (56, 90) (75, 190) (60, 95) (68, 110)
出力: 最長の塔は長さ 6 で、上から下まで: (56, 90) (60,95) (65,100) (68,110) (70,150) (75,190)
これが本の解決策です
ステップ 1 すべてのアイテムを最初に高さで並べ替え、次に重量で並べ替えます。これは、すべての高さが一意である場合、アイテムは高さで並べ替えられることを意味します。高さが同じ場合、アイテムは重量で並べ替えられます。
ステップ 2 増加する高さと増加する重みを含む最長のシーケンスを見つける これを行うには、次のようにします。
a) シーケンスの先頭から開始 現在、max_sequence は空です
b) 次のアイテムの身長と体重が前のアイテムよりも大きくない場合、このアイテムは「不適合」とマークされます</p>
c) 見つかったシーケンスに「最大シーケンス」よりも多くの項目がある場合、「最大シーケンス」になります</p>
d) その後、元のシーケンスの最後に到達するまで、「不適合アイテム」から検索を繰り返します。
その解決策についていくつか質問があります。
Q1
この解決策は間違っていると思います。
例えば
(3,2) (5,9) (6,7) (7,8)
明らかに(6,7)
不適合品ですが、いかが(7,8)
でしょうか?解決策によれば、 h と w が よりも大きいので不適切ではありませんが(6,7)
、 に適合しないため、シーケンスに含めること(7,8)
はできません(5,9)
。
私は正しいですか?
私が正しければ、修正は何ですか?
Q2
O(n^2)
上記のソリューションに修正があったとしても、ステップ 2-d に従って何度も繰り返す必要があるため、ソリューションのスタイルは少なくとも につながると思います。
O(nlogn) ソリューションを持つことは可能ですか?