题目描述
给定一个可包含重复数字的序列,返回所有不重复的全排列。
样例
输入: [1,1,2] 输出: [ [1,1,2], [1,2,1], [2,1,1] ]
思路分析
依旧是回溯法,不过要注意重复元素,加入flag标志数组判断
代码及结果
public List<List<Integer>> permuteUnique(int[] nums) {
List<List<Integer>> list = new ArrayList<List<Integer>>();
List<Integer> list1 = new ArrayList<Integer>();
boolean flag[] = new boolean[nums.length];
Arrays.sort(nums);
dfs(list, list1, nums, flag);;
return list;
}
void dfs(List<List<Integer>> list, List<Integer> list1, int[] nums, boolean[] flag){
if (list1.size() == nums.length) {
list.add(new ArrayList<Integer>(list1));
}
else {
for (int i = 0; i < flag.length; i++) {
if (flag[i]) {
continue;
}
if (i>0 && nums[i]==nums[i-1] && !flag[i-1]) {
continue;
}
list1.add(nums[i]);
flag[i] = true;
dfs(list, list1, nums, flag);
flag[i] = false;
list1.remove(list1.size()-1);
}
}
}