给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
示例 1:
输入:nums = [1,1,2]
输出:
[[1,1,2],
[1,2,1],
[2,1,1]]
示例 2:
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
来源:力扣(LeetCode)
这道题目比全排列的题目多了一个去重问题,去重问题在之前做总和问题的时候遇到过了,就是要去重,去重的时候虽然可以继续用used数组,但是used数组的小标不能再想全排列那样用 nums的数组里面的元素来当小标,因为全排列是没有重复元素的,如果这道题目也继续这样用的话 重复元素就没有了,所以要用本身nums的下标,就是uesd的下标。
package 回溯;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class 全排列II {
static List<Integer> list = new ArrayList<>();
static List<List<Integer>> res = new ArrayList<>();
public static void main(String[] args) {
int[] nums= {1,1,2};
System.out.println(permuteUnique(nums));
}
public static List<List<Integer>> permuteUnique(int[] nums) {
int[] uesd=new int[21];
Arrays.fill(uesd, 0);
Arrays.sort(nums);
backTracking(nums,uesd);
return res;
}
public static void backTracking(int[] nums,int[] used)
{
if(list.size()==nums.length)
{
res.add(new ArrayList<>(list));
return;
}
for(int i=0;i<nums.length;i++)
{
if(i>0 && nums[i]==nums[i-1] && used[i-1]==0)
{
continue;
}
if(used[i]==0)
{
used[i]=1;
list.add(nums[i]);
backTracking(nums,used);
used[i]=0;
list.remove(list.size()-1);
}
}
}
}