Menu
CoddyTech

Insert Interval

ふつう区間python iconjava iconcpp iconc iconjs icon+10

開始位置でソートされた区間のリストが、同じ長さの2つの配列として与えられます。区間 i は [starts[i], ends[i]] です。どの2つの区間も重なったり接したりしていません。さらに、新しい区間 [newStart, newEnd] が1つ与えられます。これを挿入し、重なるか接するすべての区間と結合して、すべての区間を開始位置でソートされた [start, end] のペアの2次元配列として返してください。

一方の区間の終点がもう一方の始点と同じ場合、2つの区間は接しています。たとえば [2, 4] と [4, 8] は接しており、接している区間は1つに結合されます。[1, 2] と [3, 4] は点を共有しないため、分かれたままです。

関数

insertInterval(starts: integer-array, ends: integer-array, newStart: integer, newEnd: integer) → integer-2d-array
startsinteger-array
各区間の開始位置を昇順に並べたもの
endsinteger-array
各区間の終わりは、開始位置と一致する
newStartinteger
挿入する区間の開始位置
newEndinteger
挿入する区間の終わり
戻り値integer-2d-array
挿入後の区間を [start, end] のペアとして、start の昇順に並べたもの

制約

  • 1 ≤ starts.length == ends.length ≤ 2000
  • 0 ≤ starts[i] ≤ ends[i] ≤ 105
  • ends[i] < starts[i+1]:区間は開始位置でソートされており、どの2つの区間も重なったり接したりしていません。
  • 0 ≤ newStart ≤ newEnd ≤ 105

例

入力
starts = [1, 5, 10, 15]ends = [3, 7, 12, 18]newStart = 6newEnd = 11
出力
[[1, 3], [5, 12], [15, 18]]
説明
[6, 11] は [5, 7] および [10, 12] と重なるため、3つは [5, 12] になります。[1, 3] は6より前に終わり、[15, 18] は12より後に始まるため、どちらもそのままです。

lock icon提出時に隠しテスト+20件

challenge icon

発展問題

同じリストに新しい区間を次々と挿入するとします。挿入のコストが O(log n) に加えて、重なる古い区間ごとに1ステップで済むようにするには、区間をどのように格納しますか?

コードをリセット
def insertInterval(starts, ends, newStart, newEnd):
    # ここにコードを書いてください
テストケース

ケース1

ケース2

ケース3

入力

starts = [1, 5, 10, 15]
ends = [3, 7, 12, 18]
newStart = 6
newEnd = 11

期待値

[[1, 3], [5, 12], [15, 18]]