Sobes.tech
Назад к вопросам
Middle
3

Объясните технику решения задачи о максимальном расстоянии до ближайшего занятого места

Компании, где спрашивали
VKVK

Ответ от нейросети

sobes.tech AI

Задача о максимальном расстоянии до ближайшего занятого места часто формулируется так: есть ряд мест (например, скамейки или кресла), некоторые из них заняты (обозначены 1), остальные свободны (0). Нужно найти свободное место, которое максимально удалено от ближайшего занятого.

Техника решения:

  1. Пройти по массиву и для каждого свободного места вычислить расстояние до ближайшего занятого.
  2. Для этого удобно использовать два прохода:
    • Слева направо: для каждого места запомнить расстояние до ближайшего занятого слева.
    • Справа налево: аналогично для правой стороны.
  3. Для каждого свободного места взять минимум из двух расстояний — это расстояние до ближайшего занятого.
  4. Найти максимальное из этих минимальных расстояний.

Пример на Go:

func maxDistToClosest(seats []int) int {
    n := len(seats)
    leftDist := make([]int, n)
    rightDist := make([]int, n)

    // Инициализация
    for i := 0; i < n; i++ {
        leftDist[i] = n
        rightDist[i] = n
    }

    // Слева направо
    for i := 0; i < n; i++ {
        if seats[i] == 1 {
            leftDist[i] = 0
        } else if i > 0 {
            leftDist[i] = leftDist[i-1] + 1
        }
    }

    // Справа налево
    for i := n - 1; i >= 0; i-- {
        if seats[i] == 1 {
            rightDist[i] = 0
        } else if i < n-1 {
            rightDist[i] = rightDist[i+1] + 1
        }
    }

    maxDist := 0
    for i := 0; i < n; i++ {
        if seats[i] == 0 {
            dist := leftDist[i]
            if rightDist[i] < dist {
                dist = rightDist[i]
            }
            if dist > maxDist {
                maxDist = dist
            }
        }
    }
    return maxDist
}

Такой подход эффективен и работает за O(n).