首先我将解释没有任何堆栈或队列的解决方案,然后我们可以将它们集成到我们的解决方案中,因为我们有 n+1 元素,我将认为数组的最后一个元素是 D。
所以我们可以将数组的元素分成两部分,一部分包含所有递增的元素,另一部分包含递减的元素。因此,如果我们的数组中有 k D,则前 k 个元素将属于第一部分,即 0, 1, 2, 3.....,(k-1) 下一个 ((n+1) - k) 将是第二部分并代表 I。
现在,如果我们有一个像DDD 这样的 D 序列,我们将从第一部分获取元素,即 (k-1)、(k-2)、(k-3)。
如果我们有一个类似III 的序列,我们将从第二部分中获取元素,即((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,那么我可以从S2 堆栈中弹出x 元素并将其添加到S3,最后弹出整个S3 堆栈以获得答案。
使用上面的例子:
A : IIIDDIDDDID
S1 : 0, 1, 2, 3, 4, 5
S2 : 6, 7, 8, 9, 10, 11
S3 : EMPTY
1) 弹出S2 3 次并将元素放入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
等等……