Middle
/* Местата в киното са разположени в един ред. Публиката, която току-що е пристигнала, избира място, за да седне максимално далеч от останалите зрители в реда. Това означава, че разстоянието от мястото, на което ще седне, до най-близкия зрител, трябва да бъде максимално. Гарантира се, че винаги има свободни места и че вече има поне един зрител. Напишете функция, която по даден ред места (масив от нули и единици) ще върне разстоянието от избраното място. Вход: [1, 0, 0, 0, 0, 1] Изход: 2 Вход: [1, 0, 1, 0, 0, 1, 0, 0, 0, 1] Изход: 2 Вход: [1, 0, 1, 0] Изход: 1 */
sobes.tech AI
Отговор от AI
Функцията трябва да намери място (индекс с нула), където разстоянието до най-близкото заето място (единици) е максимално.
Идея за решение:
- Обходете масива, за всяко свободно място изчислете разстоянието до най-близкото заето място.
- Върнете това максимално разстояние.
Оптималният начин е един проход с броене на разстоянията до най-близките единици наляво и надясно.
Пример на Go:
func maxDistance(seats []int) int {
n := len(seats)
leftDist := make([]int, n)
rightDist := make([]int, n)
// Запълваме разстоянията до най-близкото заето място наляво
dist := n
for i := 0; i < n; i++ {
if seats[i] == 1 {
dist = 0
} else {
dist++
}
leftDist[i] = dist
}
// Запълваме разстоянията до най-близкото заето място надясно
dist = n
for i := n - 1; i >= 0; i-- {
if seats[i] == 1 {
dist = 0
} else {
dist++
}
rightDist[i] = dist
}
maxDist := 0
for i := 0; i < n; i++ {
if seats[i] == 0 {
// Минимално разстояние до най-близкия зрител
d := leftDist[i]
if rightDist[i] < d {
d = rightDist[i]
}
if d > maxDist {
maxDist = d
}
}
}
return maxDist
}
По този начин функцията ще върне максималното разстояние до най-близкия зрител за избраното място.