Merge Intervals
区間とは、開始点と終了点を持つ整数の範囲です。少なくとも1つの点を共有する区間はひとまとまりになり、接しているだけの区間も同様です。[1, 4] と [4, 5] は [1, 5] になります。目標は、重なり合う区間の各グループを、そのグループ全体を覆う1つの区間に置き換えることです。
ポイントは順序です。区間を開始点でソートすれば、作成中の区間と重なるものはその直後に並びます。ソート済みのリストを順にたどり、最後にマージした区間を保持します。次の開始点がその終了点以下なら終了点を延ばし、そうでなければ実際の隙間があるため、新しい区間を開始します。ソートの計算量は O(n log n) で、走査は1回です。
mergeIntervalsという名前の関数を作成してください。この関数は2つの整数配列、startsとendsを受け取り、結合した区間を返します。
ここで扱うすべての言語が入力として2次元配列を受け付けるわけではないため、区間は2つの配列として渡されます。区間iは[starts[i], ends[i]]で表され、両方の配列の長さは同じです。区間はソートされていません。
重なり合う区間のグループをすべて結合してください。端点で接するだけの区間も、重なり合っているものとして扱います。結合した区間を、開始位置の昇順にソートした2次元配列[[start, end], ...]として返してください。
たとえば、starts = [5, 1, 12, 3]とends = [7, 4, 14, 6]は、[5, 7]、[1, 4]、[12, 14]、[3, 6]を表し、これらは[[1, 7], [12, 14]]に結合されます。
制約: 1 <= starts.length == ends.length <= 10^4、0 <= starts[i] <= ends[i] <= 10^4。
関数
- arg1integer-array
- arg2integer-array
- 戻り値integer-2d-array
例
- 入力
- arg1 = [5, 1, 12, 3]arg2 = [7, 4, 14, 6]
- 出力
- [[1, 7], [12, 14]]
- 入力
- arg1 = [6, 1]arg2 = [9, 6]
- 出力
- [[1, 9]]
提出時に隠しテスト+12件
ヒント
1つずつ開いてください。開くたびに少しずつ答えに近づきます。
まず各開始位置と終了位置を対応付けて、2つの別々の配列ではなく、区間全体を扱えるようにします。
区間を開始位置でソートします。その後、各区間が重なる可能性があるのは直前のグループだけで、それより前のグループとは重なりません。
- 最後に結合した区間を保持しながら、ソート済みの区間を順に見ていきます。次の区間の開始位置がその区間の終了位置以下なら、終了位置を2つの終了位置のうち大きい方に設定します。そうでなければ、そのグループは完了し、次の区間が新しいグループを開始します。
この問題の詳しい解説は準備中です。
似た問題
同じ考え方を使う問題です。2〜3問解くとパターンが身につきます。
Python
def mergeIntervals(starts, ends):
# ここにコードを書いてくださいケース1
ケース2
入力
arg1 = [5, 1, 12, 3] arg2 = [7, 4, 14, 6]
期待値
[[1, 7], [12, 14]]