给出一个具有重复数字的列表,找出列表所有不同的排列。
样例
给出列表 [1,2,2]
,不同的排列有:
[
[1,2,2],
[2,1,2],
[2,2,1]
]
import java.util.*;
class Solution {
/**
* @param nums: A list of integers.
* @return: A list of unique permutations.
*/
public List<List<Integer>> permuteUnique(int[] nums) {
// Write your code here
List<List<Integer>> res = new ArrayList<List<Integer>> ();
int n = nums.length;
Arrays.sort(nums);
int[] visited = new int[n];
helper(res, new ArrayList<Integer>(), nums, visited);
return res;
}
void helper(List<List<Integer>> res, List<Integer> tRes, int[] nums, int[] visited){
if(tRes.size()==nums.length){
List<Integer> tmp = new ArrayList<Integer>();
tmp.addAll(tRes);
res.add(tmp);
return;
}
for(int i=0; i<nums.length; i++){
//访问过,或者前面已经出现过相同的数字
if(visited[i]==1 || (i-1>=0 && visited[i-1]==0 && nums[i-1]==nums[i])){
continue;
}else{
visited[i]=1;
tRes.add(nums[i]);
helper(res, tRes, nums, visited);
tRes.remove(tRes.size()-1);
visited[i]=0;
}
}
}
}