一、问题描述
Given a collection of numbers that might contain duplicates, return all possible unique permutations.
For example,
[1,1,2]
have the following unique permutations:
[1,1,2]
, [1,2,1]
, and [2,1,1]
.
二、问题分析
与permutation1不同的是需要去重。有两种方法,①利用list的contains方法②在分支判断的时候处理。
三、Java AC代码
public List<List<Integer>> permuteUnique(int[] nums) {
List<List<Integer>> list = new ArrayList<List<Integer>>();
if (nums==null || nums.length==0) {
return list;
}
Arrays.sort(nums);
boolean[] isVisited = new boolean[nums.length];
List<Integer> item = new ArrayList<Integer>();
dfsHelper(list, item, isVisited, nums);
return list;
}
public void dfsHelper(List<List<Integer>> list, List<Integer> item, boolean[] isVisited, int[] nums){
if (item.size()==nums.length) {
list.add(new ArrayList<Integer>(item));
return ;
}
for (int i = 0; i < nums.length; i++) {
if (i>0 && nums[i-1]==nums[i] && !isVisited[i-1]) {
continue;
}
if (!isVisited[i]) {
item.add(nums[i]);
isVisited[i] = true;
dfsHelper(list, item, isVisited, nums);
isVisited[i] = false;
item.remove(item.size()-1);
}
}
}