- 全排列 II
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
输入:nums = [1,1,2]
输出:
[[1,1,2],
[1,2,1],
[2,1,1]]
关键点是使用了两个vis数组来分别监控 同一层是否插入相同的值 和 不同层是否插入相同的元素
,比如1,1,2
在第一个层遍历时插入了第一个1,那么遍历到第二个1时就不能插入在这层了,就是代码中vis1的体现。
在第一层插入第一个1,然后到第二层,遍历到第一个1时,是不能插入的,这就是代码中vis的体现
class Solution {
List<List<Integer>> lists=new ArrayList<>();
List<Integer>list=new ArrayList<>();
boolean[] vis=new boolean[8];//判断同一个元素是否出现在不同层
public List<List<Integer>> permuteUnique(int[] nums) {
Arrays.sort(nums);
dfs(0,nums);
return lists;
}
private void dfs(int idx, int[] nums) {
if (list.size()==nums.length){
lists.add(new ArrayList<>(list));
return;
}
boolean[] vis1=new boolean[22];//判断同一层是否选择了值相同的元素
for (int i = 0; i <nums.length ; i++) {
if (vis1[nums[i]+10] || vis[i])continue;
vis[i]=true;
vis1[nums[i]+10]=true;
list.add(nums[i]);
dfs(idx,nums);
list.remove(list.size()-1);
vis[i]=false;
}
}
}