047 全排列II
题目介绍:
给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
方法:回溯,递归法
思路:跟上一题很相似,只是不返回重复的值,就加一个数组来判断这个数是否使用过,使用过,就让数组为true,当这个i回溯完了,就将数组设为false。
注意判断条件:
used[i] || i > 0 && nums[i] == nums[i - 1] && used[i-1]
如果为真,或者前一个为真,但两个相同则直接下一次循环
代码:
public static List<List<Integer>> permute(int[] nums) {
List<List<Integer>> listList = new ArrayList<>();
List<Integer> list = new ArrayList<>();
permute(nums,list,listList,new boolean[nums.length]);
return listList;
}
public static void permute(int[] nums,List<Integer> list,List<List<Integer>> listList,boolean[] used){
int length=nums.length;
if(list.size()==length){
listList.add(new ArrayList<>(list));
return;
}
for (int i = 0; i <length ; i++) {
if(used[i] || i > 0 && nums[i] == nums[i - 1] && used[i-1]){
continue;
}
used[i]=true;
list.add(nums[i]);
permute(nums,list,listList,used);
list.remove(list.size()-1);
used[i]=false;
}
}