题目:47. 全排列 II
思路:回溯。
注意剪枝。
排除重复:如果两个元素相等,前者已经访问,那么说明是不同层的,可以继续回溯;前者没有访问,说明是同一层,则需要剪枝。
代码:
class Solution {
public List<List<Integer>> permuteUnique(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
boolean[] visited = new boolean[nums.length];
List<Integer> aim = new ArrayList<>();
Arrays.sort(nums);
backtrack(nums, visited, aim, res);
return res;
}
public void backtrack(int[] nums, boolean[] visited, List<Integer> aim, List<List<Integer>> res) {
if (aim.size() == nums.length) {
res.add(new ArrayList<>(aim));
return;
}
for (int i = 0; i < nums.length; i ++) {
if (visited[i] || (i > 0 && nums[i] == nums[i - 1] && !visited[i - 1])) {
continue;
}
aim.add(nums[i]);
visited[i] = true;
backtrack(nums, visited, aim, res);
aim.remove(aim.size() - 1);
visited[i] = false;
}
}
}