【问题标题】:Largest Permutation using Stack or Queue使用堆栈或队列的最大排列
【发布时间】:2016-07-01 04:34:47
【问题描述】:

所以这是一个家庭作业问题,它要求设计一个算法,找到给定 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) 时间内运行。

我目前一直在思考如何使用问题中要求的堆栈或队列来编写此问题的伪代码

【问题讨论】:

  • 我曾想过使用连续的 I 和 D 的数量来确定下一个要添加的数字,但算法需要在 O(n) 中,这样就行不通了。到目前为止,这确实是我设法想出的唯一一个可以在没有 O(n) 限制的情况下工作的方法。

标签: stack queue permutation


【解决方案1】:

首先我将解释没有任何堆栈或队列的解决方案,然后我们可以将它们集成到我们的解决方案中,因为我们有 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 个堆栈S2S3S2 最初包含整个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

等等……

【讨论】:

    猜你喜欢
    • 2021-03-17
    • 2018-04-08
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 2018-06-14
    • 2021-07-08
    • 1970-01-01
    • 2014-04-21
    相关资源
    最近更新 更多