Menu
CoddyTech

Non-overlapping Intervals

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

区間のリストが2つの配列として与えられます。区間 i は starts[i] から ends[i] までです。残った区間同士が重ならないように、できるだけ少ない数の区間を削除してください。一方の区間が終わる位置ともう一方の区間が始まる位置がちょうど同じで、区間が接しているだけの場合は重なっていません。

削除する必要がある区間の最小数を返す、eraseOverlapIntervals という名前の関数を書いてください。

関数

eraseOverlapIntervals(starts: integer-array, ends: integer-array) → integer
startsinteger-array
各区間の開始
endsinteger-array
各区間の終了位置。開始位置と同じインデックスにあります
戻り値integer
残りの区間が重複しないように削除する区間の最小数

制約

  • 1 ≤ starts.length == ends.length ≤ 5000
  • -5 × 104 ≤ starts[i] < ends[i] ≤ 5 × 104
  • 区間はソートされていません。2つの区間が同一の場合があります。

例

入力
starts = [3, 1, 5, 2]ends = [6, 4, 7, 3]
出力
2
説明
開始時刻の順では、区間は [1,4]、[2,3]、[3,6]、[5,7] です。接しているだけの [2,3] と [3,6] を残し、ほかの2つを削除します。3つ残すことはできません。[1,4] は [2,3] と重なり、[3,6] は [5,7] と重なります。また、4つのうちどの3つを選んでも、これらのペアのいずれかを含みます。

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

challenge icon

発展問題

各区間に値も設定されていて、重複しない区間の値の合計を最大にしたいとします。最も早く終了する区間を残す方法は、依然として有効でしょうか?代わりにどのような方法を使いますか?

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

ケース1

ケース2

ケース3

入力

starts = [3, 1, 5, 2]
ends = [6, 4, 7, 3]

期待値

2