我们需要在原序列中挑选出一个长度为k
的子序列,要求该子序列包含1, 2, ..., k
,且每个数字只出现一次。字典序最小意味着我们在每一步选择时,要尽可能选择一个较小的数字。
为了解决这个问题,我们可以使用栈(Stack)来辅助选择数字。栈结构的特点是后进先出(LIFO),可以帮助我们在遍历过程中保持字典序最小。
现在有一个长度为n的数字序列,每个数都在1~k的范围内,且1~k内每个数字都至少出现过一次。现在我们想在这里面找一个子序列,使得1~k恰好出现一次,且字典序最小。请你通过程序得出结果。
我们认为:
B是A的子序列,当且仅当可以从A中删掉0个或任意个元素之后按照原来的顺序拼接起来得到B。
序列A的字典序小于B,当且仅当存在一个位置k,使得A[k]<B[k]且A[i]=B[i],i=1...k−1。
第一行两个空格隔开的正整数n和k;
第二行n个空格隔开的正整数,表示该数字序列ai。 1≤k≤n≤5∗104,1≤ai≤k
输出一行k个数字,表示字典序最小的子序列。不要输出行末空格。
输入
5 3
2 1 3 3 2
输出
1 3 2
说明
其中一种可行的方案为:2 {1} {3} 3 {2},选定括号中的数字,构成子序列,可知此时字典序最小。