Я пытаюсь решить проблему Messy Medians для функционального программирования на хакерранке.
Мое решение (ниже) слишком медленное.Это время ожидания почти половины тестовых случаев.
@tailrec
def calculate(steps: List[Int], states: List[List[Int]]): List[Int] = {
steps match {
case x::xs =>
if(x > 0) {
states match { //apend state
case Nil => calculate(xs, List(x) :: states)
case y :: _ => calculate(xs, (x :: y) :: states)
}
} else {
calculate(xs, states.drop(-x-1).head :: states) //rollback state
}
case Nil => states
.reverse
.map { // calculate median
case List(x) => x
case xs => xs.sorted.apply(if (xs.length % 2 != 0) xs.length/2 else xs.length/2 - 1)
}
}
}
Как я могу его оптимизировать?Может быть до 100000 входных состояний.Когда я использовал TreeSet
вместо List
для состояния, он начал работать быстрее, но затем он перестал работать для случаев, когда есть повторяющиеся числа.Есть ли что-то в scala как отсортированный список?