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]
.
所以只需要
if (i > 0 && num[i] == num[i - 1] && !used[i - 1])
continue;
下面是完整代码 来自大神Code_Ganker
public static ArrayList<ArrayList<Integer>> permuteUnique(int[] num) {
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> temp = new ArrayList<Integer>();
if (num == null || num.length == 0)
return result;
boolean[] used = new boolean[num.length];
Arrays.sort(num);
helper(num, used, temp, result);
return result;
}
public static void helper(int[] num, boolean[] used,
ArrayList<Integer> temp, ArrayList<ArrayList<Integer>> result) {
if (temp.size() == num.length) {
result.add(new ArrayList<Integer>(temp));
return;
}
for (int i = 0; i < num.length; i++) {
if (i > 0 && num[i] == num[i - 1] && !used[i - 1])
continue;
if (!used[i]) {
temp.add(num[i]);
used[i] = true;
helper(num, used, temp, result);
temp.remove(temp.size() - 1);
used[i] = false;
}
}
}