7

私はインタビューの質問に出くわしました:

「さまざまな象の寿命を考えると、最大数の象が生きていた期間を見つけてください。」例:
入力:[5, 10]、、 出力: (3頭[6, 15]の象)[2, 7]
[6,7]

この問題は、各文字列が期間の連続範囲を表すように、「n」個の文字列の最長の部分文字列の問題に関連しているのではないかと思います。

例: [5,10] <=> 5 6 7 8 9 10

そうでない場合、この問題の良い解決策は何でしょうか?C++でコーディングしたい。

どんな助けでもありがたいです。

4

5 に答える 5

8

象ごとに、象の誕生、象の死亡という 2 つのイベントを作成します。イベントを日付順に並べ替えます。イベントを見て、何頭のゾウが生きているかを数えてみてください。新しい最大値に達するたびに開始日を記録し、最大値から下がるたびに終了日を記録します。

このソリューションは、日付が整数であることに依存しません。

于 2012-09-18T19:50:28.467 に答える
2

私が面接にいた場合、std::array最大ageの象を作成し、次のように象ごとに要素数を増やします。

[5,10] <<5 to 10配列内のインデックスからすべての要素をインクリメントします 。

次に、並べ替えて、最大の数がどこにあるかを見つけます。

(1期~期、2期~象の数)のstd::mapように使用する可能性があります。map<int,int>デフォルトでソートされます。

もっと良い解決策を知っているかどうか疑問に思っていますか?

于 2012-09-18T19:07:23.480 に答える
0

これは、括弧が欠落していないかどうかを確認するプログラムに似ています。また、日付範囲の重複にも関連しています。この主題は、StackOverflowやその他の場所で殴打されて死にます。ここにあります:

2つの日付範囲が重複しているかどうかを判断する

これを実装するには、範囲内のすべての開始/終了を構造体(またはクラス)の1つのベクトルに配置し、それらを並べ替えます。次に、ベクトルを実行して、象のレベルの遷移を検出できます。(象の数-問題を述べる面白い方法です!)

于 2012-09-18T19:04:08.957 に答える
0

あなたの入力から、すべての期間が重複していることがわかりました。その場合、解決策は簡単です

[start end] として範囲が指定されています

したがって、答えはすべての開始点の最大値とすべての終了点の最小値になります。

各期間をトラバースして、すべての開始の最大値とすべての終了の最小値を見つけるだけです

注 : このソリューションは、すべての期間が重複する場合に適用できます。

あなたの例では、すべての入力の最大値= 6すべての出力の最小値= 7

于 2016-09-08T19:23:28.227 に答える