並べ替えで重なる区間を 1 つにまとめる

区間問題 63

会議室の​予約の​時間帯の​並びから、​重なったり接したりする​時間帯を​まとめて、​使われている​時間帯の​一覧を​作る。​始まりの​順に​並べ替えれば、​前から​ 1 回なめるだけで​まとめられます。

海外で定番の問題リスト 4 本のうち 4 本に入っています (Blind 75、NeetCode 150、Grind 75、LeetCode Top Interview 150)

問題

会議室の予約の時間帯が、[始まり, 終わり] の組の並び intervals で渡されます。重なっている時間帯と、ちょうど接している時間帯 (片方の終わりと、もう片方の始まりが同じ) を 1 つにまとめ、まとめた後の時間帯を始まりの小さい順に並べて返す関数を書いてください。

  • intervals は並べ替えられていません
  • どの組も、始まりは終わり以下です。始まりと終わりが同じ組もあります
  • intervals の長さは 1 以上 10000 以下、値はどれも 0 以上 10000 以下です

入力と出力の例

例 1

[1, 4] と [3, 6] が重なり、[10, 11] は [9, 12] の中に入っています。

入力

intervals = [[9, 12], [1, 4],
  [3, 6], [10, 11]]

出力

[[1, 6], [9, 12]]

例 2

終わりと始まりが同じなら、接しているのでまとめます。

入力

intervals = [[2, 5], [5, 8]]

出力

[[2, 8]]

例 3

あとから来た短い時間帯が、長い時間帯の中に収まる場合です。終わりは大きい方を取ります。

入力

intervals = [[1, 10], [2, 3],
  [4, 8]]

出力

[[1, 10]]

面接での聞かれ方

面接では、カレンダーや予約の話として渡されることが多いです。

  • 「区間の配列があります。重なっているものをまとめてください」
  • 「並べ替え済みですか」と聞き返すと、「いいえ」と返ってくるのがふつうです
  • 書き終えたあとに「並べ替えなしでできますか」「区間が次々に届くならどうしますか」と、続きを聞かれることもあります

接している区間をまとめるかどうかは、場面によって違います。[2, 5] と [5, 8] をまとめるのかを、先に確かめておきます。

アルゴリズムのチートシートの「配列と文字列」に、​この​型の​要点を​表と​コードで​まとめています。

main.py
def merge_intervals(intervals):
    # ここに書きます
    pass


# 「実行」を押すと、この行の結果が出ます
print(merge_intervals([[9, 12], [1, 4], [3, 6], [10, 11]]))

できているか「例で確かめる」を押すと、問題の例を全部この関数に渡して、通ったかをここに出します