给定一个数组,请写一个算法来求取该数组的全排列。
1. dfs
1 | private static void permutation(int[] src) |
2. 交换法
将第一个元素不断地与后面的元素交换,代表了以不同元素开头的情况。然后递归的对后面的元素进行同样的处理。
每次递归结束后,再将元素换回来(回溯):
1 | /** |
以几个例子来说明。
以 [1, 2]
为例
以1为首元素(即与自己交换)
只有一个[1, 2]
,返回交换1和2,代表了以2为第一个元素的情况
得到[2, 1]
以 [1, 2, 3]
为例:
- 以1为首元(交换自己)
- 后面的部分是
[2, 3]
- 同第一个例子,依次得到
[1, 2, 3]
和[1, 3, 2]
- 交换回来(还是1和1换),返回初始的
[1, 2, 3]
- 后面的部分是
- 把1和2交换得到
[2, 1, 3]
- 处理
[1, 3]
部分- 1和1交换,然后到达了边界处,输出
[2, 1, 3]
,返回 - 1和3交换,到达边界处,输出
[2, 3, 1]
。返回后将1和3换回来,回到了刚才[2, 1, 3]
的情况
- 1和1交换,然后到达了边界处,输出
[1, 3]
处理完,返回到最开始的[2, 1, 3]
处,将1和2还回来。
- 处理
- 继续交换1和3,做同样的处理。