46. 全排列 (2022.03.25)

108 阅读1分钟

========================================================================================================================================================================

` 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;
}

}

`

image.png