目录
3、输出受限的双端队列(前端相当于栈,后端相当于队列,就是头挨着的意思,序列从中间分开,两边必须是向端方向单调递增。)
关于双端队列的基本概念和什么叫受限双端队列,请戳双端队列与受限双端队列。
本文主要通过一个经典的习题来分享一下受限双端队列的入队和出队情况。
设有一个双端队列,输入序列为1,2,3,4,试分别求出以下条件的输出序列。
(1)能由输入受限的双端队列得到,但不能由输出受限的双端队列得到的输出序列
(2)不能由输入受限的双端队列得到,但能由输出受限的双端队列得到的输出序列
(3)既不能由输入受限的双端队列得到,又不能由输出受限的双端队列得到的输出序列
看完是不是有点想打人,那我们从容易到简单把这个题拆分来说一说。
设有一个双端队列,元素进入该队列的顺序是1,2,3,4,试分别求出满足下列条件的输出序列。
1、左边完全受限的双端队列(右边完全受限的双端队列一样)
就相当于一个栈,栈底是左端,栈顶是右端,输出序列我们暂时记为A1,A2,A3,A4。
最重要的结论来了,当Ai = N (i,N为1到4的正整数),比Ai先入栈的元素在输出序列中的顺序必须和入栈顺序相反,依次出栈。
比如输出为3,*,*,*; 则后面三个未知序列中不允许出现1在2前面输出。 因为以3开头说明3是第一个出栈的元素,而1只能在2出栈之后才有可能出栈
这个规律是顺延到后面的每一位,比如输出为1。*,*,*。则后面三个数字剩余2,3,4这三个数,如果4在头,那后面两位只能是3,2,不能是2,3这种(好绕,不知道我有没有说清楚,没搞清楚的多读两遍,琢磨琢磨)
所以不可能的序列就有
4,1,2,3
4,1,3,2
4,2,1,3
4,2,3,1
4,3,1,2
3,1,2,4
3,1,4,2
3,4,1,2
2,4,1,3
1,4,2,3
总共有10种。则满足的序列为剩余的 4!- 10 = 14种。
2、输入受限的双端队列(队首在后端)
我们的队列入队还是只有一端入队,为1,2,3,4;出队是可以两端任意出队。
我们在第一步的基础上只需要分析,第一种不能出队的那10种情况现在哪些可以了就行。
4,1,2,3 √
4,1,3,2 √
4,2,1,3 4先出队,说明是等完全入队之后才开始出队,所以只能走4后面只能跟1或者3 ×
4,2,3,1 ×
4,3,1,2 √
3,1,2,4 √
3,1,4,2 √
3,4,1,2 √
2,4,1,3 因为入队顺序是1,2,3,4,;所以如果2是第一个出队,只能是从右边出队,而且是在2入队之后,3入队之前这个时间点。 √
1,4,2,3 完全入队之后左右间隔出队即可 √
综上所述,输入受限的双端队列的可能的出队序列个数为 4!- 2 = 22;
3、输出受限的双端队列(前端相当于栈,后端相当于队列,就是头挨着的意思,序列从中间分开,两边必须是向端方向单调递增。)
与第二个输入受限的双端队列类似,我们输出受限的双端队列也建立在第一个左边完全受限的双端队列的基础上再进行分析。
4,1,2,3 4开头说明4和1分别是前后端的队首,假定4在前端队首,而1,2,3依次从后端入队,则输出顺序正好满足√
4,1,3,2 次序列要成立,4必须入前端,3,2可以入后端,但是1就没地方入队了,所以此序列有误。
4,2,1,3 4,2,1| 3 √
4,2,3,1 错误,还是那个道理,序列从中间分开,两边必须是向端方向单调递增。
4,3,1,2 4,3 | 1,2
3,1,2,4 //3往下的就不再解释
3,1,4,2
3,4,1,2
2,4,1,3
1,4,2,3
综上所述,输出受限的双端队列的可能的出队序列个数为 4!- 2 = 22;
看到这儿上面那个题也就不用说了吧,最后一个输出受限的双端队列,切记两端队列的头是挨着的,在中间,切记,切记!!!
你,总要埋头去做一些事情,不是吗