46.全排列
给定一个 没有重复 数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
解题思路:
ans集合存储所有结果可能
temp存储每个可能结果
vis数组存储每个位置是否被访问过
k==length说明产生了一种结果,则把这种结果加入集合中
利用深度优先遍历,将每个位置访问,形成新的结果,达到长度后,进行回溯,去放开每个位置,利用循环遍历该位置之后形成新的组合
代码:
/** *作者:魏宝航 *2020年11月25日,下午14:02 */ class Solution { public List<List<Integer>> ans=new ArrayList<List<Integer>>(); public Integer[] temp; public boolean[] vis; public static int length=0; public List<List<Integer>> permute(int[] nums) { length=nums.length; vis=new boolean[length]; temp=new Integer[length]; dfs(nums,0); return ans; } public void dfs(int[] nums,int k){ if(k==length){ List<Integer> temp1=new ArrayList<>(); temp1=Arrays.asList(temp); List<Integer> temp2=new ArrayList<>(temp1); ans.add(temp2); return; } for(int i=0;i<length;i++){ if(!vis[i]){ temp[k]=nums[i]; vis[i]=true; dfs(nums,k+1); vis[i]=false; } } } }
执行结果: