给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
思路:典型的回朔算法,只是多了一步去重。。。。
class Solution {
int[] flag=new int[15];
List<List<Integer>> ans=new ArrayList<List<Integer>>();
List<Integer> res=new ArrayList<Integer>();
public List<List<Integer>> permuteUnique(int[] nums) {
if(nums.length==0)
return ans;
Arrays.parallelSort(nums);
for(int i=0;i<nums.length;i++)
flag[i]=0;
dfs(nums,0);
return ans;
}
private void dfs(int[] nums,int p)
{
if(p==nums.length)
{
ans.add(new ArrayList<Integer>(res));
return;
}
for(int i=0;i<nums.length;i++)
if(flag[i]==0)
{
if(i>0 && nums[i]==nums[i-1] && flag[i-1]==0)
continue;
flag[i]=1;
res.add(nums[i]);
dfs(nums,p+1);
res.remove(p);
flag[i]=0;
}
}
}