Given a collection of distinct numbers, return all possible permutations.
For example,[1,2,3]
have the following permutations:
[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]总而言之,就是要你求给定数组的全排列
思路:
一开始看这题就想着用递归,就按递归的写法来吧
举个列子,假定一个数组是a[3]={0,1,2},用交换的方法来排列
那么先固定第一个数0,交换后面两个数1,2,得到两种排列
之后第一个数与第二个数交换,得到a[]={1,0,2}
固定第一个数1,交换后面两个数0,2,得到两种排列
为了防止重复,需要每次都恢复成原来的数组{0,1,2}
之后第一个数与第三个数交换,得到a[]={2,1,0}
固定第一个数2,交换后面两个数1,0,得到两种排列
...以此类推
因此可以看到固定的套路就是,固定第一个数,交换后面的数,得到排列
当数组的长度为n时,每一次循环,最外层的递归是以start为起点的数组,每个数组的值依次和以start为下标的值交换,递归达到最底层时,就是最后一个数自己和自己交换(第一个swap),此时start的值等于数组长度,将排列结果加入到集合中,然后复原(第二个swap),返回上层递归,就是倒数一个数和倒数第二个数交换(第一个swap),再进到底层递归,最后一个数自己和自己交换,此时由于之前已经被交换过,所以现在出现第二种排列,此时start的值等于数组长度,将排列结果加入到集合中,然后复原(第二个swap)...
代码如下
public class Solution {
public List> permute(int[] nums) {
List> lists = new ArrayList<>();
execute(lists,nums,0,nums.length);
return lists;
}
public void execute(List> lists,
int[] nums,int start,int length){
if(start == length)
{
List list = new ArrayList<>();
for(int i=0;i
全排列的算法还有很多,其他自己百度吧