整数数组的一个 排列  就是将其所有成员以序列或线性顺序排列。整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。 根据定义不难想到,我们只需从右往左找到第一个arr[i] < arr[i + 1]的数即可。为什么?

  1. 因为是第一个arr[i] < arr[i + 1], 也就是意味着 i 之后数组是非严格递减的,也就是满足 j 。也就是说所有的j都无法交换成为next permutation, 否则就会字典序减小。
  2. i 右侧一定有至少一个大于的数,找到这个最小且大于arr[i]的数与arr[i]进行交换,不会原来影响原来数组数组,也就是说依旧是非严格递减的。
  3. 换位之后虽然比远来大了,但是不是下一个,需要将[i + 1, n]全部reverse,这样从i + 1开始将是一个非严格递增序列,也将是最小的一个比原来字典序大的排序