Используйте стек.Время выполнения O (ходы + длина).
Каждый раз, когда значение увеличивается на 1, добавляйте (position, end_val) в стек.Каждый раз, когда значение уменьшается на 1, удалите верхний элемент стека и сопоставьте его позицию с позицией слева от вашей текущей позиции.
Например, [5, 3, 2, 5]
process 5: an increase. Stack is now (0,1), (0,2), (0,3), (0,4), (0,5)
process 3: a decrease at index 1. Remove the top two elements from the stack and record these moves (0,0) (0,0). The stack is now (0,1), (0,2), (0,3)
process 2: a decrease at index 2. Remove the top element from the stack and record (0,1). The stack is now (0,1), (0,2)
process 5: an increase at index 3. The stack is now (0,1), (0,2), (3,3), (3,4), (3,5)
process 0 (implied): a decrease at index 4. record (3,3), (3,3), (3,3), (0,3), (0,3)
Последние ходы: (0,0) (0,0), (0,1), (3,3), (3,3), (3,3), (0,3), (0,3).
Вы можете добиться большего успеха в пространстве, записывая одноуровневые изменения положения (например, (0,5) для первого хода), но эффективность времени одинакова, поскольку каждое движение может быть толькоизмените значение на 1.