Нахождение ошибки в алгоритмической задачи на динамическое плавающее окно

Рейтинг: 0Ответов: 0Опубликовано: 13.06.2023

Имеется следующая задача - https://informatics.msk.ru/mod/statements/view.php?chapterid=112560#1

Написал алгоритм, который решает её через метод динамического плавающего окна посредством двух итераторов.

  1. Заводим два итератора
  2. Двигаем правый итератор всегда, левый итератор двигаем только когда мы нашли необходимое количество деревьев (смотреть на ассоциативный массив state)
  3. Во время "скольжения окна" подсчитываем минимальное расстояние между итераторами, если оно минимальное
fun findMinimumTreeSegment(k: Int, trees: List<Int>): Pair<Int, Int> {
    var left = 0
    val state = mutableMapOf<Int, Int>() // type, frequency
    var min = Int.MAX_VALUE
    var resultL = 0
    var resultR = 0

    for (right in 1 until trees.size) {
        state.computeIfPresent(trees[right]) { _, v -> v + 1 }
        state.putIfAbsent(trees[right], 1)
        while (left != right && state.size >= k) {
            if (right - left + 1 < min) {
                min = right - left + 1
                resultL = left
                resultR = right
            }
            
            state.computeIfPresent(trees[left]) { _, v -> v - 1 }
            if (state[trees[left]] == 0)
                state.remove(trees[left])

            left += 1
        }
    }

    return Pair(minOf(resultL + 1, trees.size), minOf(resultR + 1, trees.size))
}

К сожалению в коде есть ошибка, так как один из тестов системы не проходит. Подозреваю, что алгоритм не обрабатывает подобные сценарии:

N = 2, K = 1
1 1

Ответ будет 1 2, хотя вроде как должен быть 1 1 или 2 2. Не подскажите как можно исправить данное решение?

Ответы

Ответов пока нет.