========================================================================================================================================================================
` class Solution {
List<List<Integer>> res = new ArrayList();
public List<List<Integer>> permute(int[] nums) {
dfs(0,nums,res);
return res;
}
// 实例【1,2,3】
// 第一层递归,全排列中第0号元素谁选
// 第二层递归,全排列中第1号元素谁选
// ....
// 从第i个开始做选择,前1~i-1个已经选择好了
private void dfs(int i,int[] nums,List<List<Integer>> res){
//base case
if(i==nums.length){
List<Integer> path = new ArrayList();
for(int num:nums){
path.add(num);
}
res.add(path);
}
//选取i之后的元素,谁来当i号元素
//这个for循坏我思考许久,它是让每一个后续元素都有机会来交换,
//这是一个广度的分配,就是说让递归树从根节点出发的分支变多,
//而index+1的递归过程是让其中一个分支的深度增加,
//同时在广度上依然会用到循环,设计十分精妙。
for(int j=i;j<nums.length;j++){
swap(nums,i,j);
dfs(i+1,nums,res);
swap(nums,j,i);
}
}
private void swap(int[] nums,int i,int j){
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
}
`