使用堆栈或队列的最大排列

时间:2016-07-01 04:34:48

标签: stack queue permutation

所以这是一个功课问题,它要求设计一个算法,找到给定n的最大排列,一个数组,A包含字母I和D或长度n,并产生S,一个n + 1这样的数组{0 ... n}中的每个整数只出现一次。

在数组A中,I表示递增,D表示递减。

所以给出的例子是 如果n = 4且A = IIID则S = 1; 2; 3; 4; 0 如果n = 6且A = IDIDID则S = 5; 6; 3; 4; 1; 2; 0因为它大于S = 5; 6; 2; 4; 1; 3; 0

该算法还需要在O(n)时间内运行。

我目前仍然坚持如何根据问题中的要求使用堆栈或队列来编写此问题的伪代码

1 个答案:

答案 0 :(得分:0)

首先,我将解释没有任何堆栈或队列的解决方案,然后我们可以将它们集成到我们的解决方案中,因为我们有n+1个元素,我会认为数组的最后一个元素是D

因此,我们可以将数组的元素分为两部分,一部分包含所有增加的元素,另一部分包含减少的元素。因此,如果我们的数组中有k个D,那么前k个元素将属于第一个部分,即0, 1, 2, 3.....,(k-1)下一个((n+1) - k)将是第二部分并代表I&# 39; S

现在,如果我们有一个类似DDD的D序列,我们将从第一部分中取出元素,即(k-1),(k-2),(k-3)。< / p>

如果我们有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个堆栈S2S3S2最初包含整个A2数组,并{{ 1}}最初会是空的。因此,如果我有S3,那么我可以从x堆栈中弹出x个元素并将其添加到S2,最后弹出整个S3堆栈得到答案。

使用上面的例子:

S3

A : IIIDDIDDDID

S1 : 0, 1, 2, 3, 4, 5

S2 : 6, 7, 8, 9, 10, 11

1)弹出S3 : EMPTY 3次并将元素放在S2中然后堆栈有

S3

S2 : 6, 7, 8

2)弹出S3 : 11, 10, 9并放在答案中。

S3

S3 : EMPTY

3)弹出S1 2次并放在答案中。

ANS : 9, 10, 11

S2 : 0, 1, 2, 3

等等......