今天摸了一些栈相关的题目。效率低下。。。

周知,栈是一个先进后出的数据结构。

也正因为这个特性,可以得出一个比较重要的性质:当某元素出栈时,则先于该元素入栈并且没有出栈的元素一定逆序输出。

所以,当给定一个输入序列和一个输出序列,要求所用的栈的大小,我们可以通过将输入序列的各元素升序标记,然后计算输出序列的最长下降子序列的长度。

eg: 1234567->2436517 => 3

那么,如何理解这一点呢。

要求最小栈的大小,也即看栈内需要积压多少元素才能实现给定的输出。

由于我们已经将输入序列按升序标记了,所以积压在栈内的元素必然为升序,也即在出栈后会表现为降序。

同时需要注意到,元素可以入栈后直接出栈,所以积压的元素出栈的顺序并不一定连续,也即相对顺序。

那么就可以得出一个结论,输出序列中的下降子序列都是靠积压在栈里面得出的。

所以输出序列中的最长的下降子序列自然需要最大的栈,也即题目所要求的最小的栈的大小。