想定される面接の質問 重なり合う区間をすべて求める方法
質問内容
面接の質問ではない それ自体
これはインタビューの質問ではありませんが、私のプロジェクトで出会ったものです。
あなたはN組の区間(例えば整数)を持っています。 あなたは、O(N)時間で互いに重複するすべての間隔を特定することを要求されています。例えば、あなたが
{1, 3} {12, 14} {2, 4} {13, 15} {5, 10}
の場合、答えは {1, 3}, {12, 14}, {2, 4}, {13, 15} となります。なお、グループ化する必要はないので、結果は例のようにどのような順序でも構いません。
KMPアルゴリズムが文字列検索にO(N)の時間を要するので、O(N)の時間を投入しただけです。 :D
私が考え出した最高のもので、今プロジェクトで使っているものは O(N^2) です。ええ、ブルートフォースはかなり悲しいですが、誰も文句を言わないので、私はそれをリファクタリングしません。 :P それでも、私は、より大きな頭がより優雅な解決策を持っているかどうか知りたいと思いました。
どのように解決するのですか?
区間の終点を配列に放り込み、始点か終点のどちらかに印をつけます。区間が閉じている場合は始点より終点を、半開きの場合はその逆にして、同点を解消することでソートします。
1S, 2S, 3E, 4E, 5S, 10E, 12S, 13S, 14E, 15E
次に、リストを通して反復し、いくつのインターバルにいるかを追跡します(これは処理された開始点の数から終了点の数を引いたものに等しい)。すでにインターバルに入っているときに始点にぶつかると、これはインターバルが重なっていることを意味します。
1S, 2S, 3E, 4E, 5S, 10E, 12S, 13S, 14E, 15E
^ ^
overlap overlap
端点にデータを並べて保存し、どの区間にいるのかを記録しておくことで、どの区間がどの区間に重なっているのかがわかります。
これはO(N logN)の解であり、ソートが主な要因である。
関連
-
[解決済み】Quickselectの時間の複雑さを説明する
-
[解決済み] グラフにおいて最小容量が最大となる経路の探索
-
[解決済み] 複雑さ O(log(n)) は O(sqrt(n)) と同等か?
-
[解決済み] 最小ボトルネックスパニングツリーと最小スパニングツリーはどう違うのですか?
-
[解決済み] 簡単な面接問題が難しくなった:1~100の数字が与えられたとき、ちょうどk個の数字が欠けていることを見つけなさい。
-
[解決済み] リストのすべての並べ換えを生成するには?
-
[解決済み】アルゴリズムの時間複雑性を求めるには?
-
[解決済み] Googleの面接でのトリッキーな質問
-
[解決済み] キャッシュの無効化 - 一般的な解決策はありますか?
-
[解決済み] トライ式と基幹トライ式のデータ構造の違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] どのようにすれば、ほとんどすべてのアルゴリズムを修正して、最良の場合の実行時間を持つようにできるか?
-
[解決済み] ベルマンフォードとダイクストラの比較。どのような状況下でベルマンフォードが優れているか?
-
[解決済み] 2進数が3で割れているかどうかを知るには?
-
[解決済み] CLRSの相対的漸近成長に関する問題(表)の解き方について教えてください。
-
[解決済み] log(n!)=Θ(n-log(n))でしょうか?
-
[解決済み] ブルームフィルターを使用するメリットは何ですか?
-
[解決済み] クイックソートとマージソートの比較 [重複]。
-
[解決済み] ハングマンの難易度を「易しい」「中くらい」「難しい」に分類するためのアルゴリズム
-
[解決済み] 重なり合う円の面積の合計
-
[解決済み] 円内の点の位置の計算