Description
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],
[2,1,1]
]
Solution
DFS
注意這道題目里面可能有重復(fù)元素,不能用swap的方式,因?yàn)榻粨Q之后數(shù)組就不能保證有序,跳過duplicate的邏輯就會被打破。所以用一個(gè)輔助boolea[] used用來表示某個(gè)位置的元素是否被使用過。
class Solution {
public List<List<Integer>> permuteUnique(int[] nums) {
List<List<Integer>> permutations = new ArrayList<>();
if (nums == null || nums.length < 1) {
return permutations;
}
Arrays.sort(nums);
// used[i] means whether num[i] has been used in current permutation
boolean[] used = new boolean[nums.length];
List<Integer> permutation = new ArrayList<>();
permuteRecur(nums, used, permutation, permutations);
return permutations;
}
public void permuteRecur(int[] nums,
boolean[] used,
List<Integer> permutation,
List<List<Integer>> permutations) {
if (permutation.size() == nums.length) {
permutations.add(new ArrayList<>(permutation));
return;
}
int i = 0;
while (i < nums.length) {
if (!used[i]) {
permutation.add(nums[i]);
used[i] = true;
permuteRecur(nums, used, permutation, permutations);
used[i] = false;
permutation.remove(permutation.size() - 1);
// find next different value
while (++i < nums.length && nums[i - 1] == nums[i]) {}
} else {
++i;
}
}
}
}