有n个数字a[n](1<= a[i] <=k), 保证1-k每个数字至少出现一次, 求字典序最小的全排列 题目。
为什么单调栈一定能找到最优解?
使用反证法:
假设正确答案是
x
1
,
x
2
,
x
3
,
x
4
,
.
.
.
,
x
k
x_1, x_2, x_3, x_4, ..., x_k
x1,x2,x3,x4,...,xk。
假设通过单调栈找到的答案是
y
1
,
y
2
,
y
3
,
y
4
,
.
.
.
,
y
k
y_1, y_2, y_3, y_4, ..., y_k
y1,y2,y3,y4,...,yk。
假设这两个答案不同,设二者从
i
i
i位置开始不同(前
i
−
1
i-1
i−1个数字相同,
x
i
≠
y
i
x_i \neq y_i
xi=yi)。
设
a
=
x
i
a = x_i
a=xi,
b
−
y
i
b - y_i
b−yi。
显然
b
<
a
b < a
b<a 是不可能的(不可能找到比正确答案更优的答案),只能是
b
>
a
b > a
b>a 。
也就是说在正确答案中
b
b
b排在了
a
a
a之后,而在单调栈的答案中
b
b
b排在了
a
a
a之前。
也就是说在单调栈寻找答案的过程中,加入
a
a
a时没有让
b
b
b弹出栈。
有两种情况:
一种是
a
a
a后面没有与
b
b
b相等的数了,但是在正确答案中
b
b
b排在了
a
a
a后面,所以a后面是存在b的,所以这种情况是不存在的。
另一种是加入
a
a
a时,弹出栈顶元素的过程中遇到了比a更小的数c,那么最终答案中a之前的数是一个比a小的数c,这与b > a 相矛盾。