今天被问到一个全排列的前一个问题,没有说明白,这里自己总结一下。
问题:给定一个有序数组,每个数字唯一,再任意个一个数组数字的排列,返回这个排列的上一个。
例如:给定有序数组[1,2,3]
可能的排列有:
[1,2,3]
[1,3,2]
[2,1,3]
[2,3,1]
[3,1,2]
[3,2,1]
给排列[2,1,3],返回[1,3,2]
解题思路是通过排列组合的规则获取给定排列的位置,通过排列规则-1获取上一个位置,在通过规则获取结果。
分析过程为:可以把这种排列组合理解为改变进制的数字,例如上面arr[1,2,3]组成的数组,可以理解为进制为[2,1,0]的数组,即数组位置arr[0]所在位置++或者--, 总的改变量为2,arr[1]所在位置++或者--改变量为1,arr[2]所在位置自身无法改变,之前的内容决定了这里是什么。
不太容易解释,先写一下不考虑性能的代码理解解题思路,后面再分析精简后的代码。
理解思路的代码
include
#include
#include
#include
#include
usin