全排列 II
题目链接:力扣题目链接
难度:中等
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
示例 1:
输入:nums = [1,1,2]
输出:
[[1,1,2],
[1,2,1],
[2,1,1]]
思路
此题和46.全排列的区别在于给定一个可包含重复数字的序列, 要返回所有不重复的全排列。涉及到了去重,去重一定要对元素进行排列,这样我们才方便对元素进行排序。
回溯代码
class Solution{
List<List<Integer>> result = new ArrayList<>();
boolean[] used;
public List<List<Integer>> permuteUnique(int[] nums) {
if(nums.length == 0){
return result;
}
Arrays.sort(nums);
used = new boolean[nums.length];
permuteUnique(nums,new LinkedList<>());
return result;
}
private void permuteUnique(int[] nums,LinkedList<Integer> path){
if(nums.length == path.size()){
result.add(new ArrayList<>(path));
return;
}
for(int i=0;i<nums.length;i++){
// used[i - 1] == false,说明同⼀树层nums[i - 1]使⽤过
// 如果同⼀树层nums[i - 1]使⽤过则直接跳过
if(i>0 && nums[i] == nums[i-1] && !used[i-1]){
continue;
}
//如果同⼀树⽀nums[i]没使⽤过开始处理
if(!used[i]){
//标记同⼀树⽀nums[i]使⽤过,防止同一树枝重复使用
used[i] = true;
path.add(nums[i]);
permuteUnique(nums,path);
//回溯,说明同⼀树层nums[i]使⽤过,防止下一树层重复
used[i] = false;
path.removeLast();
}
}
}
}