47. 全排列 II (2022.03.26)

145 阅读1分钟

============================================================================================================================================================================ ` class Solution { List<List> res = new ArrayList();

public  List<List<Integer>> permuteUnique(int[] nums) {
    dfs(0,nums,res);
    System.out.println(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号元素
    HashMap<Integer,Boolean> visit = new HashMap<>();
    for (int num : nums) {
        visit.put(num,false);
    }


    // ??????剪枝的时候对应关系,下标??

    for(int j=i;j<nums.length;j++){
        if(!visit.get(nums[j])){
            visit.put(nums[j],true);
            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

image.png

18.png

19.png

对于记忆化搜索中缓存技术的位置: 此哈希表应该放在循环外面,你如果放在循坏里面,那么你的哈希表的范围是每一层中的一个广度,无法 包括其他分支的广度。你是无法走到去重的。