Pular para o conteudo principal

Mínimo de salas de reunião

Como descobrir quantas reuniões ficam ativas ao mesmo tempo rastreando inicios e fins em ordem.

Dado um array de intervalos intervals, onde cada item representa o início e o fim de uma reunião, retorne o número mínimo de salas necessárias para acomodar todas as reuniões.

Se uma reunião termina no mesmo instante em que outra começa, a sala pode ser reutilizada.

Exemplo:

Input:  intervals = [[0,30],[5,10],[15,20]]
Output: 2

O que perceber antes de codar

Erros comuns

Passo 1 - Traduzir o que a resposta realmente mede

A pergunta não e:

  • "como distribuir as reuniões em salas?"

A pergunta e:

  • "qual o maior número de reuniões ativas ao mesmo tempo?"

Essa e a quantidade mínima de salas.

Passo 2 - Escrever a versão inicial mais direta

Uma versão inicial natural e:

  • ordenar por início
  • manter uma lista com o horario de fim de cada sala em uso
  • para cada reunião, procurar linearmente uma sala livre

Funciona.

Mas quando ha muitas salas ativas, você compara demais.

Passo 3 - Perguntar qual comparação realmente importa

Para saber se alguma sala pode ser reutilizada, você não precisa olhar todas.

Você precisa saber:

  • qual e o menor horario de termino entre as salas ocupadas

Se nem essa sala já ficou livre, nenhuma outra ficou.

Passo 4 - Transformar isso em uma varredura de eventos

Uma forma limpa e separar:

  • todos os inicios
  • todos os fins

Depois você anda pelos inicios em ordem e libera salas sempre que o menor fim já passou.

O número máximo de reuniões simultâneas vira a resposta.

O editor interativo precisa de JavaScript. Voce ainda pode ler o desafio e copiar o codigo inicial abaixo.

Codigo inicial

export function minMeetingRooms(intervals: number[][]): number {
  // sua solução aqui
  return 0
}
solution.ts
Travado? Dicas disponiveis.

Ainda não resolveu?

Ver a solução agora pode reduzir o aprendizado. Vale a pena tentar mais um pouco.

Abrir a solucao de referencia

Sem JavaScript, a solucao de referencia aparece inline em vez de um dialogo.

Solução

Complexidade final

Tempo: O(n log n)

Espaço: O(n)

Solução 1 - Procurar sala livre varrendo a lista de fins rumo a O(n²)

Boa versão inicial porque deixa claro o custo de testar cada sala uma a uma.

export function minMeetingRooms(intervals: number[][]): number {
  if (intervals.length === 0) {
    return 0
  }

  const sorted = [...intervals].sort((a, b) => a[0] - b[0])
  const roomEndTimes: number[] = []

  for (const [start, end] of sorted) {
    let assigned = false

    for (let index = 0; index < roomEndTimes.length; index += 1) {
      if (roomEndTimes[index] <= start) {
        roomEndTimes[index] = end
        assigned = true
        break
      }
    }

    if (!assigned) {
      roomEndTimes.push(end)
    }
  }

  return roomEndTimes.length
}

Funciona, mas a busca linear por sala livre repete comparação demais e pode escorregar para O(n²).

Solução 2 - Varredura com inicios e fins ordenados em O(n log n)

Agora a pergunta fica mais focada: quantas reuniões estao ativas neste momento?

export function minMeetingRooms(intervals: number[][]): number {
  if (intervals.length === 0) {
    return 0
  }

  const starts = intervals.map(([start]) => start).sort((a, b) => a - b)
  const ends = intervals.map(([, end]) => end).sort((a, b) => a - b)

  let endIndex = 0
  let activeRooms = 0
  let maxRooms = 0

  for (const start of starts) {
    while (endIndex < ends.length && ends[endIndex] <= start) {
      activeRooms -= 1
      endIndex += 1
    }

    activeRooms += 1
    maxRooms = Math.max(maxRooms, activeRooms)
  }

  return maxRooms
}

O insight forte aqui e que você não precisa modelar as salas em detalhes. Só precisa rastrear quantas ainda estao ocupadas.

Outra versão comum usa um heap para manter no topo a sala com menor horario de termino. A ideia central continua igual: o menor fim ativo e a primeira referência que você precisa testar.

O que dizer na entrevista

Uma explicação curta e boa seria:

O problema pede o pico de reuniões simultâneas. A versão inicial tenta encaixar cada reunião em alguma sala livre e acaba varrendo várias salas. A versão melhor separa inicios e fins ordenados. Quando um início chega, eu libero todas as reuniões cujo fim já passou e depois conto a nova reunião como ativa. O máximo de ativas ao longo da passada e a quantidade mínima de salas, e o custo total continua em O(n log n) por causa da ordenação.

Isso mostra que você:

  • traduziu a pergunta para reuniões simultâneas
  • evitou modelagem desnecessaria
  • justificou a ordenação e a passada linear

Quando esse padrão aparece de novo

Esse padrão reaparece quando você precisa:

  • contar intervalos ativos ao mesmo tempo
  • usar varredura de eventos em vez de comparação total
  • distinguir reuso imediato de sobreposição real
  • resolver capacidade mínima em agendas, filas e janelas de tempo

O ponto não e decorar esse problema.

O ponto e aprender a ler intervalos como eventos de entrada e saída.

Proximo desafio Dicionário alienígena Desafio anterior K-ésimo menor elemento em uma árvore binária de busca

Desafios relacionados

Artigos relacionados