Middle
/* Os lugares no cinema estão dispostos numa única fila. O espectador que acaba de chegar escolhe um lugar para ficar o mais longe possível dos outros espectadores na fila. Ou seja, a distância desde o lugar onde se senta até ao espectador mais próximo deve ser máxima. É garantido que há sempre lugares livres e que já há pelo menos um espectador sentado. Escreve uma função que, dada uma fila de lugares (um array de zeros e uns), devolva a distância desde o lugar escolhido. Entrada: [1, 0, 0, 0, 0, 1] Saída: 2 Entrada: [1, 0, 1, 0, 0, 1, 0, 0, 0, 1] Saída: 2 Entrada: [1, 0, 1, 0] Saída: 1 */
sobes.tech IA
Resposta da IA
A função deve encontrar o lugar (índice com zero) onde a distância até ao lugar ocupado mais próximo (uns) seja máxima.
Ideia da solução:
- Percorrer o array, para cada lugar livre calcular a distância até ao lugar ocupado mais próximo.
- Devolver essa distância máxima.
A forma ótima é uma única passagem com a contagem das distâncias aos uns mais próximos à esquerda e à direita.
Exemplo em Go:
func maxDistance(cadeiras []int) int {
n := len(cadeiras)
distEsq := make([]int, n)
distDir := make([]int, n)
// Preencher as distâncias até ao lugar ocupado mais próximo à esquerda
dist := n
for i := 0; i < n; i++ {
if cadeiras[i] == 1 {
dist = 0
} else {
dist++
}
distEsq[i] = dist
}
// Preencher as distâncias até ao lugar ocupado mais próximo à direita
dist = n
for i := n - 1; i >= 0; i-- {
if cadeiras[i] == 1 {
dist = 0
} else {
dist++
}
distDir[i] = dist
}
maxDist := 0
for i := 0; i < n; i++ {
if cadeiras[i] == 0 {
// Distância mínima ao espectador mais próximo
d := distEsq[i]
if distDir[i] < d {
d = distDir[i]
}
if d > maxDist {
maxDist = d
}
}
}
return maxDist
}
Assim, a função devolverá a distância máxima ao espectador mais próximo para o lugar escolhido.