输入k
=堆栈数
input = 5, 3, 4, 1, 2
output should be = 5, 4, 3, 2, 1
但是你只能弹出输入,无法推送。 output
也是另一个堆栈,您可以返回并推送但无法弹出
所以如果k = 1
in = 5, 3, 4, 1, 2 k = (), out = ()
in = 3, 4, 1, 2 k = 5 out = ()
in = 4, 1, 2 k = 5,3 out = ()
in = 1, 2 k = 5,3,4 out = ()
in = 2 k = 5,3,4 out = 1 // since you know 1 must go first
in = () k = 5,3,4 out = 1,2
由于您无法回到in
,因此没有解决方案,您必须报告。
然而,肯定存在某些具有解决方案的排序,并且可能具有不同的k
值。例如,如果k = 2
并且有两个堆栈,上面的输入顺序是否可以解决?
我怎么知道要推送哪个堆栈?
我的思维过程是
1. pop input
2. pop all k stacks
3. see if any popped values == target, starting with 1 and incrementing
4. if they do == target, push to out
5. if in != target, push to stack k***
但我们应该推送哪个堆栈?是我被困住的地方。如果你可以回过头来,这个问题就非常容易了。
这听起来像一个河内式问题的塔,但我不确定。我觉得有一种解决这个问题的数学方法。有什么想法吗?
编辑:我的另一个直觉是,河内的塔有一个限制,你不能在较小的一个上面放一个更大的钉子。这也是有道理的,因为说k = 1,这个问题基本上是一个河内问题的塔,除了磁盘最初不遵守规则,但应该遵守规则,如果解决方案是可能的...答案 0 :(得分:0)
您可以使用两个辅助堆栈,s1,s2:
所以看起来应该是这样的:
fill(s1,o) // step 1
u = s1, v = s2
repeat
e = less(v,u) // step 2
push(r,e)
swap(u,v)
until empty(u)
似乎无法移除一个辅助堆栈。我认为这个问题只能解决k> = 2。