Menu
CoddyTech

Insert Interval

ŚredniePrzedziałypython iconjava iconcpp iconc iconjs icon+10

Otrzymujesz listę przedziałów posortowanych według początku, podaną jako dwie tablice o tej samej długości: przedział i to [starts[i], ends[i]]. Żadne dwa z nich nie nakładają się ani nie stykają. Otrzymujesz też jeden nowy przedział, [newStart, newEnd]. Wstaw go, scal z każdym przedziałem, z którym się nakłada lub styka, i zwróć wszystkie przedziały jako tablicę 2D par [start, end], posortowanych według początku.

Dwa przedziały stykają się, gdy jeden kończy się tam, gdzie zaczyna się drugi, tak jak [2, 4] i [4, 8]; stykające się przedziały łączą się w jeden. [1, 2] i [3, 4] nie mają wspólnych punktów, więc pozostają rozdzielone.

Funkcja

insertInterval(starts: integer-array, ends: integer-array, newStart: integer, newEnd: integer) → integer-2d-array
startsinteger-array
początek każdego przedziału, w kolejności rosnącej
endsinteger-array
koniec każdego przedziału, odpowiadające mu początki
newStartinteger
początek przedziału do wstawienia
newEndinteger
koniec przedziału do wstawienia
Zwracainteger-2d-array
przedziały po wstawieniu jako pary [start, end], posortowane według początku

Ograniczenia

  • 1 ≤ starts.length == ends.length ≤ 2000
  • 0 ≤ starts[i] ≤ ends[i] ≤ 105
  • ends[i] < starts[i+1]: przedziały są posortowane według początku i żadne dwa z nich nie nakładają się ani nie stykają.
  • 0 ≤ newStart ≤ newEnd ≤ 105

Przykłady

Wejście
starts = [1, 5, 10, 15]ends = [3, 7, 12, 18]newStart = 6newEnd = 11
Wyjście
[[1, 3], [5, 12], [15, 18]]
Wyjaśnienie
[6, 11] nakłada się na [5, 7] i [10, 12], więc te trzy przedziały łączą się w [5, 12]. [1, 3] kończy się przed 6, a [15, 18] zaczyna się po 12, więc oba pozostają bez zmian.

lock icon+20 ukrytych testów przy wysłaniu

challenge icon

Pytanie dodatkowe

Załóżmy, że wstawiasz wiele nowych przedziałów, jeden po drugim, do tej samej listy. Jak przechowywać przedziały, aby każde wstawienie kosztowało O(log n) plus jeden krok za każdy stary przedział, który pochłania?

Zresetuj kod
def insertInterval(starts, ends, newStart, newEnd):
    # Wpisz kod tutaj
Przypadki testowe

Przypadek 1

Przypadek 2

Przypadek 3

Wejście

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

Oczekiwane

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