内容提要
这篇文章讲述了如何找到下一个字典序的排列。首先找到递减序列,然后找到比递减序列中的第一个数字大的最小数字,并将其与递减序列中的第一个数字交换位置。最后,将递减序列后面的数字按照递增顺序排列。文章还提到了两种特殊情况的处理方法。
延伸解读
字典序的直观理解
文章指出题目介绍可能误导,但字典序就是默认的字符串排序方式:逐个字符对比,同一位相同再比下一位。例如11在12前,12在13前。对于数字序列,递增序列是最小的,递减序列是最大的。理解这一点是解题的基础,避免被题目描述带偏。
从后往前找递减序列的原因
解题关键是从后往前找到递减序列,因为递减序列已经是当前部分的最大排列,调整必须发生在它之前。这类似于数学进位:个位9已最大,需向前一位加1,同时将后面变为最小。找到第一个非递减元素后,在递减序列中从后往前找比它大的最小数字交换,才能得到最接近的下一个排列。
交换后为何还要反转
交换后,递减序列部分仍然保持递减,但这不是下一个排列,而是下N个。因为交换后整个序列已经比原序列大,要使它成为最接近的下一个,必须让后面的数字尽可能小,即变为递增序列。由于后面原本是递减的,直接反转即可得到递增,从而得到正确结果。
特殊情况的处理
文章提到两种特殊情况:一是整个序列完全递减,此时下一个排列是重新开始,即整个序列排序为递增;二是序列完全递增,此时只需交换最后两位。实际上,第二种情况可以视为第一种的变体,因为完全递增时,从后往前找不到递减序列,但交换末两位即可得到下一个排列。
Q&A
如何找到下一个字典序的排列?
首先从后往前找到递减序列,然后找到比递减序列中第一个数字大的最小数字进行交换,最后将后面的数字按递增顺序排列。
什么是字典序?
字典序是字符串的默认排序方式,逐个字符对比,类似于查字典的顺序。
为什么要找到递减序列?
因为递减序列已经是最大的,调整时需要在这个序列之前进行,以找到下一个最接近的排列。
在什么情况下整个序列会变为递增?
当整个序列本身就是递减时,下一个排列就是将整个序列排序为递增。
如何处理完全递增的序列?
对于完全递增的序列,只需交换末两位即可得到下一个排列。
如何确保后面的数字变为递增序列?
在交换后,需要将递减序列后的数字按递增顺序排列,以确保得到下一个字典序的排列。