3 つの組に分けて新しい区間を差し込む

区間問題 158

始まりの順に並んだ重ならない予約の並びに、新しい予約を 1 本差し込み、重なる物をまとめた並びを返す。手前、重なる所、後ろの 3 つに分ければ、並べ替えずに前から 1 回なめるだけで済みます。

海外で定番の問題リスト 4 本には入っていません

問題

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

  • booked は始まりの小さい順に並んでいて、どの 2 つも重ならず、接してもいません
  • booked は空のこともあります
  • どの組も、始まりは終わり以下です
  • booked の長さは 0 以上 10000 以下、値はどれも 0 以上 100000 以下です
  • 渡された booked の中身は書き換えないでください

入力と出力の例

例 1

[6, 10] は [5, 7] と [9, 12] の両方に重なるので、3 つが [5, 12] にまとまります。

booked = [[1, 3], [5, 7], [9, 12], [15, 18]] extra = [6, 10]
[[1, 3], [5, 12], [15, 18]]

例 2

どれとも重ならないときは、始まりの順の位置へそのまま入ります。

booked = [[4, 6], [10, 13]] extra = [7, 8]
[[4, 6], [7, 8], [10, 13]]

例 3

[4, 8] は、前の [2, 4] とも後ろの [8, 9] とも接しているので、全部が 1 つにまとまります。

booked = [[2, 4], [8, 9]] extra = [4, 8]
[[2, 9]]

面接での聞かれ方

面接では、区間をまとめる問題の続きとして出されることが多いです。

  • 「並んだ予約の一覧に、新しい予約を 1 つ足してください。重なったらまとめてください」
  • 「区間をまとめる問題と同じように、足してから並べ替えればいいですか」と聞くと、「並んでいることを使ってください」と返ってくるのがふつうです
  • 「接している予約はまとめますか」と、端の扱いを聞かれることもあります

入力が並び済みで重ならないこと、接している物をまとめるかどうかを、書く前に確かめておきます。

ヒント

まだ開いていません

付箋は 3 枚。下の段ほど答えに近づきます

  1. ヒント 2

  2. ヒント 3答えに近い

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

配列と文字列の問題は、全部の組を調べると手間が大きくなる所を、窓や左右の添字で減らす形が多いです。

main.py
def insert_interval(booked: list[list[int]], extra: list[int]) -> list[list[int]]:
    """
    Goal: 何を返すか

    idea1: まず思いつく案
    -> runtime: O(?)  space: O(?)

    idea2: もっと速い案
    -> runtime: O(?)  space: O(?)

    edge case: 空、1 つだけ、など
    """
    # ここに書きます
    pass


# 「実行」を押すと、この行の結果が出ます
print(insert_interval([[1, 3], [5, 7], [9, 12], [15, 18]], [6, 10]))

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