Given a collection of numbers that might contain duplicates, return all possible unique permutations.
- Example:
Input: [1,1,2]
Output:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
解法
这个题和前面一题有点类似,但是它允许数字重复,但输出的全排列中不可以有重复的组合,所以要改变一下Permutations里的代码
public List<List<Integer>> permuteUnique(int[] nums) {
List<List<Integer>> res=new ArrayList<List<Integer>>();
List<Integer> list=new ArrayList<Integer>();
Arrays.sort(nums);
boolean[] visited=new boolean[nums.length];
permutedfs(nums,visited,list,res);
return res;
}
private void permutedfs(int[] nums, boolean[] visited, List<Integer> list, List<List<Integer>> res) {
// TODO Auto-generated method stub
if(list.size()==nums.length)
{
res.add(new ArrayList<Integer>(list));
return;
}
for(int j=0;j<nums.length;j++)
{
if(visited[j])
continue;
if ((j>0 && nums[j] == nums[j - 1])&&!visited[j-1])
continue;
visited[j]=true;
list.add(nums[j]);
permutedfs(nums, visited, list, res);
list.remove(list.size()-1);
visited[j]=false;
}
}
Runtime: 2 ms, faster than 100.00% of Java online submissions for Permutations II.
Memory Usage: 39.5 MB, less than 56.43% of Java online submissions for Permutations II.
if ((j>0 && nums[j] == nums[j - 1])&&!visited[j-1])
这条语句用于避免出现重复组合,如果nums[j]==nums[j-1]而visited[j-1]为false的话说明与nums[j]相等的上一个数字已经排列过了,再用它排列就会出现重复,因此要跳过这个数据