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