1.给定一个数组,数组中元素均不相同,写出数组元素的全排列组合
比如:
[1,2,3]
Output:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
由于数组中不含相同元素,所有不用考虑重复问题,现在我们来解析 [1,2,3]的全排列是如何得到的:
1,2,3的全排列,我们先看后两个数[2,3]的全排列,很明显是2,3 和3,2,分别以2开头和3开头
然后看[1,2,3]的全排列,分别为1,2,3;1,3,2;2,1,3;2,3,1;3,1,2;3,2,1;它们是以1开头和2,3全排列的组合,
以2开头1,3,全排列的组合,以3开头1,2,全排列的组合
也就是说我们可以将三个数的全排列问题转化为两个数的全排列问题,方法是:将数组中的每一个数均与数组的第一位的数进行交换,然后对剩下的数进行全排列;每一次交换后要交换回去,因为每一次都是在[1,2,3]的基础上进行的
以[1,2,3]为例就是,数组中的每一个元素都与第一为元素进行交换,1与第一位元素交换,得1,2,3;然后交换回去,为下一次交换做准备
2与第一位元素交换,得2,1,3;
3与第一位元素交换,得3,2,1;
然后对于得到1,2,3;2,1,3;3,2,1问题就可以缩减为除去第一位后2,3; 1,3; 2,1的全排列,然后与第一位组合
而对于2,3的全排列,也可以使用同样的方法,分别将元素2,3与第一位元素进行交换,继续缩减问题,转化为1个元素的全排列问题,对于2,3就是2,3;3,2;然后转化为单元素3和2的全排列问题
1,2,3 //原问题
/ | \
1,2,3 2,1,3 3,2,1 //遍历数组将数组元素分别与第一位元素交换,缩减问题为两个数的全排列问题,将问题缩减为了[2,3];[1,3];[2,1]的全排列问题
/ \