Sobes.tech
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 АИ

Одговор од АИ

Функция должна найти место (индекс с нулём), где расстояние до ближайшего занятого места (единицы) максимально.

Идея решения:

  • Пройти по массиву, для каждого свободного места вычислить расстояние до ближайшего занятого.
  • Вернуть максимальное такое расстояние.

Оптимальный способ — один проход с подсчётом расстояний до ближайших единиц слева и справа.

Пример на 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
}

Так функция вернёт максимальное расстояние до ближайшего зрителя для выбранного места.