Menu
CoddyTech

Insert Interval

MedioIntervallipython iconjava iconcpp iconc iconjs icon+10

Ricevi un elenco di intervalli ordinati per valore iniziale, fornito come due array della stessa lunghezza: l'intervallo i è [starts[i], ends[i]]. Nessuno di essi si sovrappone o tocca gli altri. Ricevi anche un nuovo intervallo, [newStart, newEnd]. Inseriscilo, uniscilo a ogni intervallo con cui si sovrappone o che tocca e restituisci tutti gli intervalli come array 2D di coppie [start, end], ordinati per valore iniziale.

Due intervalli si toccano quando uno termina dove inizia l'altro, come accade con [2, 4] e [4, 8], e gli intervalli che si toccano si fondono in uno solo. [1, 2] e [3, 4] non condividono alcun punto, quindi restano separati.

Funzione

insertInterval(starts: integer-array, ends: integer-array, newStart: integer, newEnd: integer) → integer-2d-array
startsinteger-array
l'inizio di ogni intervallo, in ordine crescente
endsinteger-array
la fine di ogni intervallo, in corrispondenza degli inizi
newStartinteger
l'inizio dell'intervallo da inserire
newEndinteger
la fine dell'intervallo da inserire
Restituisceinteger-2d-array
gli intervalli dopo l’inserimento come coppie [start, end], ordinate per start

Vincoli

  • 1 ≤ starts.length == ends.length ≤ 2000
  • 0 ≤ starts[i] ≤ ends[i] ≤ 105
  • ends[i] < starts[i+1]: gli intervalli sono ordinati per punto di inizio e nessuna coppia si sovrappone o si tocca.
  • 0 ≤ newStart ≤ newEnd ≤ 105

Esempi

Input
starts = [1, 5, 10, 15]ends = [3, 7, 12, 18]newStart = 6newEnd = 11
Output
[[1, 3], [5, 12], [15, 18]]
Spiegazione
[6, 11] si sovrappone a [5, 7] e [10, 12], quindi i tre intervalli diventano [5, 12]. [1, 3] termina prima di 6 e [15, 18] inizia dopo 12, quindi entrambi rimangono invariati.

lock icon+20 test nascosti all’invio

challenge icon

Per approfondire

Supponiamo che tu inserisca molti nuovi intervalli, uno dopo l’altro, nella stessa lista. Come memorizzeresti gli intervalli in modo che ogni inserimento costi O(log n) più un passaggio per ogni vecchio intervallo che ingloba?

Ripristina il codice
def insertInterval(starts, ends, newStart, newEnd):
    # Scrivi il codice qui
Casi di test

Caso 1

Caso 2

Caso 3

Input

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

Atteso

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