给定一个可包含重复数字的序列 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]]
提示:
1 <= nums.length <= 8
-10 <= nums[i] <= 10
import java.util.*;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
SolutionTest solution = new SolutionTest();
List<List<Integer>> list = solution.permuteUnique(new int[]{1,2,3});
System.out.println(list);
}
}
class SolutionTest {
Set<String> set;
List<List<Integer>> list;
public List<List<Integer>> permuteUnique(int[] nums) {
set = new HashSet<>();
list = new ArrayList<>();
dfs(nums,0);
return list;
}
public void dfs(int[] nums,int k){
int n = nums.length;
if(k == n){
StringBuffer sb = new StringBuffer();
for(int i =0;i<n;i++){
sb.append(Integer.toString(nums[i]));
}
if(set.add(sb.toString())){
List<Integer> tempList = new ArrayList<>();
for(int i = 0;i<n;i++){
tempList.add(nums[i]);
}
list.add(tempList);
}
}
for(int i =k;i<n;i++){
swap(nums,i,k);
dfs(nums,k+1);
swap(nums,i,k);
}
}
public void swap(int[] nums,int a,int b){
int temp = nums[a];nums[a] = nums[b]; nums[b] = temp;
}
}