下一个排列
Last updated
Last updated
问题简述
思路
为了使下一个排列更大,一个方法是将一个左边的「较小数」与一个右边的「较大数」交换;而为了使变大的幅度最小,需要让这个「较小数」尽量靠右,而「较大数」尽可能小。
具体实现:
找左边界:从后往前遍历,找到第一个 l
使 a[l]
小于 a[l + 1]
,此时必有 a[l+1:]
为逆序;
找右边界:再次从后往前遍历,找到第一个大于 a[l]
的位置 r
;因为 a[l+1:]
,所以 j
依次遍历即可,此时 a[l+1:]
依然为逆序;
交换 a[l]
和 a[r]
;
将 a[l+1:]
倒序;
第 4 步说明:
在第 3 步交换 a[l]
和 a[r]
后,无论 a[l+1:]
无论怎么调整,都是比原来更大的排列,而其中最小的排列就是 a[l+1:]
为顺序的情况,又因为此时 a[l+1:]
正好为逆序,所以将其做倒置即可;