Нахождение ошибки в алгоритмической задачи на динамическое плавающее окно
Имеется следующая задача - https://informatics.msk.ru/mod/statements/view.php?chapterid=112560#1
Написал алгоритм, который решает её через метод динамического плавающего окна посредством двух итераторов.
- Заводим два итератора
- Двигаем правый итератор всегда, левый итератор двигаем только когда мы нашли необходимое количество деревьев (смотреть на ассоциативный массив
state
) - Во время "скольжения окна" подсчитываем минимальное расстояние между итераторами, если оно минимальное
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
. Не подскажите как можно исправить данное решение?
Источник: Stack Overflow на русском