Description:
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]
]
题意:给定一个序列(可能包含重复的元素),返回其所有可能的排列(不包含重复的序列);
解法:解决排列的问题一般使用回溯算法,这道题需要解决的问题是如何判断当前产生的序列是否为重复的;因此,我们构造一个visited表用于记录遍历过的位置,为便于判断重复,我们首先对数组进行排序,这样如果我们遇到当前元素和数组上一个位置的元素相同时并且上一个元素未被访问过,则跳过此次循环;
Java
class Solution {
public List<List<Integer>> permuteUnique(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
if (nums.length == 0) return result;
boolean[] visited = new boolean[nums.length];
Arrays.sort(nums);
getPermutation(nums, result, new ArrayList<>(), visited, 0);
return result;
}
private void getPermutation(int[] nums, List<List<Integer>> result,
List<Integer> list, boolean[] visited, int pos) {
if (pos == nums.length) {
result.add(new ArrayList<>(list));
return;
}
for (int i = 0; i < nums.length; i++) {
if (visited[i] || (i > 0 && nums[i] == nums[i - 1] && !visited[i - 1])) continue;
list.add(nums[i]);
visited[i] = true;
getPermutation(nums, result, list, visited, pos + 1);
visited[i] = false;
list.remove(list.size() - 1);
}
}
}