Menu
CoddyTech

Insert Interval

MédioIntervalospython iconjava iconcpp iconc iconjs icon+10

Você recebe uma lista de intervalos ordenados por início, fornecida como dois arrays de mesmo tamanho: o intervalo i é [starts[i], ends[i]]. Nenhum par deles se sobrepõe ou se toca. Você também recebe um novo intervalo, [newStart, newEnd]. Insira-o, mescle-o com todos os intervalos com os quais ele se sobrepõe ou se toca e retorne todos os intervalos como um array 2D de pares [start, end], ordenados por início.

Dois intervalos se tocam quando um termina onde o outro começa, como acontece com [2, 4] e [4, 8], e intervalos que se tocam são mesclados em um só. [1, 2] e [3, 4] não compartilham nenhum ponto, então permanecem separados.

Função

insertInterval(starts: integer-array, ends: integer-array, newStart: integer, newEnd: integer) → integer-2d-array
startsinteger-array
o início de cada intervalo, em ordem crescente
endsinteger-array
o fim de cada intervalo, correspondendo aos inícios
newStartinteger
o início do intervalo a ser inserido
newEndinteger
o fim do intervalo a inserir
Retornainteger-2d-array
os intervalos após a inserção como pares [start, end], ordenados por start

Restrições

  • 1 ≤ starts.length == ends.length ≤ 2000
  • 0 ≤ starts[i] ≤ ends[i] ≤ 105
  • ends[i] < starts[i+1]: os intervalos estão ordenados pelo início, e nenhum deles se sobrepõe ou toca outro.
  • 0 ≤ newStart ≤ newEnd ≤ 105

Exemplos

Entrada
starts = [1, 5, 10, 15]ends = [3, 7, 12, 18]newStart = 6newEnd = 11
Saída
[[1, 3], [5, 12], [15, 18]]
Explicação
[6, 11] se sobrepõe a [5, 7] e [10, 12], então os três se tornam [5, 12]. [1, 3] termina antes de 6 e [15, 18] começa depois de 12, então ambos permanecem como estão.

lock icon+20 testes ocultos ao enviar

challenge icon

Para ir além

Suponha que você insira muitos novos intervalos, um após o outro, na mesma lista. Como você armazenaria os intervalos para que cada inserção custasse O(log n) mais uma etapa para cada intervalo antigo que ela absorve?

Redefinir código
def insertInterval(starts, ends, newStart, newEnd):
    # Escreva o código aqui
Casos de teste

Caso 1

Caso 2

Caso 3

Entrada

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

Esperado

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