Сначала я объясню решение без какого-либо стека или очереди, то мы можем интегрировать их в нашем решении, так как мы имеем n+1
элементов, я рассмотрю последний элемент массива как D
.
Таким образом, мы можем разделить элементы массива на 2 части, содержащие все увеличивающиеся элементы, а другие - уменьшающиеся элементы. Итак, если у нас есть k
D's в нашем массиве, первые k элементов будут принадлежать первой части, то есть 0, 1, 2, 3.....,(k-1)
следующая ((n+1) - k)
будет второй частью и представляет I.
Теперь, если у нас есть последовательность D, как DDD
, мы возьмем элементы из первой части i.e (k-1), (k-2), (k-3).
Если у нас есть последовательность I, как III
, мы возьмем элементы со второй части i.e ((n+1)-2), ((n+1)-1), (n+1)
.
Позволяет объяснить это на примере:
A : IIIDDIDDDIID //I have added the last D
n = 11
A1 : 0, 1, 2, 3, 4, 5
A2 : 6, 7, 8, 9, 10, 11
Во-первых, мы имеем III
, мы размещаем 9, 10, 11
из второй части. Тогда у нас есть DD
. Мы размещаем 5, 4
так же, как мы обсуждали в вышеуказанной части, тогда у нас есть I
, после чего мы разместим 8
со второй части и так далее.
Продолжая выше, мы имеем: 9, 10, 11, 5, 4, 8, 3, 2, 1, 6, 7, 0
Алгоритм:
Для A1
части массива мы будем держать стек S1
и когда нам нужны элементы, которые мы выскочит из стека.
Для A2
части массива мы будем держать 2 стак S2
и S3
, S2
содержит весь A2
массив изначально, и S3
будет пустым изначально. Поэтому, если у меня есть x
, тогда я могу вытащить x
элементов из стека S2
и добавить его в S3
и, наконец, поместить весь стек S3
, чтобы получить ответ.
с использованием приведенного выше примера:
A : IIIDDIDDDID
S1 : 0, 1, 2, 3, 4, 5
S2 : 6, 7, 8, 9, 10, 11
S3 : EMPTY
1) Pop S2
3 раза и поместить Elemen TS в S3
то стек имеет
S2 : 6, 7, 8
S3 : 11, 10, 9
2) Поп S3
и место в ответе.
S3 : EMPTY
ANS : 9, 10, 11
3) Поп-S1 2 раза и место в ответе.
S2 : 0, 1, 2, 3
ANS : 9, 10, 11, 5, 4
И так далее ...
Я думал об использовании числа я 'и D's в строке, чтобы определить, какое количество, чтобы добавить следующий, но алгоритм должен быть в O (n), чтобы это не сработало. Пока это действительно единственное, что мне удалось придумать, что может потенциально работать без ограничения O (n). – irfatftw