整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。
根据定义不难想到,我们只需从右往左找到第一个arr[i] < arr[i + 1]的数即可。为什么?
- 因为是第一个
arr[i] < arr[i + 1], 也就是意味着i之后数组是非严格递减的,也就是满足j。也就是说所有的j都无法交换成为next permutation, 否则就会字典序减小。 i右侧一定有至少一个大于的数,找到这个最小且大于arr[i]的数与arr[i]进行交换,不会原来影响原来数组数组,也就是说依旧是非严格递减的。- 换位之后虽然比远来大了,但是不是下一个,需要将
[i + 1, n]全部reverse,这样从i + 1开始将是一个非严格递增序列,也将是最小的一个比原来字典序大的排序