给出一个具有重复数字的列表,找出列表所有不同的排列。
样例
给出列表 [1,2,2],不同的排列有:
[
[1,2,2],
[2,1,2],
[2,2,1]
样例
给出列表 [1,2,2],不同的排列有:
[
[1,2,2],
[2,1,2],
[2,2,1]
]
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
/**
* 给出一个具有重复数字的列表,找出列表所有不同的排列。
样例
给出列表 [1,2,2],不同的排列有:
[
[1,2,2],
[2,1,2],
[2,2,1]
]
*
* @author Dell
*
*/
public class Test16 {
public static List<List<Integer>> permuteUnique(int[] nums)
{
List<Integer> list=new ArrayList<>();
List<List<Integer>> result=new ArrayList<>();
boolean[] used =new boolean[nums.length];
Arrays.sort(nums);
backtracking(nums,used,list,result);
return result;
}
public static void backtracking(int[] a, boolean[] used, List<Integer> list,List<List<Integer>> result)
{
if(list.size()==a.length)
result.add(new ArrayList<>(list));
else
{
for(int i=0;i<a.length;i++)
{
if(used[i]||i>0&&a[i-1]==a[i]&&used[i-1]==false)
{
continue;
}
used[i]=true;
list.add(a[i]);
backtracking(a,used,list,result);
used[i]=false;
list.remove(list.size()-1);
}
}
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[] a=new int[n];
for(int i=0;i<a.length;i++)
{
a[i]=sc.nextInt();
}
List<List<Integer>> result=permuteUnique(a);
System.out.println(result);
}
}