题目详述
给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
回溯法
class Solution {
int[] nums;
List<List<Integer>> output = new ArrayList();
public List<List<Integer>> permuteUnique(int[] nums) {
this.nums = nums;
// 为防止判断有遗漏,先进行排序
Arrays.sort(nums);
int[] visited = new int[nums.length];
backtrack(new ArrayList<Integer>(), visited);
return output;
}
private void backtrack(ArrayList<Integer> tmp, int[] visited) {
if (tmp.size() == nums.length) {
output.add(new ArrayList<>(tmp));
return;
}
for (int i = 0; i < nums.length; i ++) {
// 合理剪枝,去除重复项
if (visited[i] == 1 || (i > 0 && visited[i - 1] == 0 && nums[i - 1] == nums[i]))
continue;
visited[i] = 1;
tmp.add(nums[i]);
backtrack(tmp, visited);
visited[i] = 0;
tmp.remove(tmp.size() - 1);
}
}
}