【DFS】LeetCode 47. 全排列 II
题目链接
思路
借用代码随想录的图。
以最右侧的分支为例,首先将 2
摆在第一位,剩下两个 1
,在走完左边的 1
分支之后,对右边的 1
进行判断,发现右边的 1
还是和左边的一样,摆在第二个位置上(因为 used[i - 1] == false
,说明左边的 1
没有使用)。因此判断出两个树枝搜索出的结果是相同的,进行剪枝。
代码
class Solution {
private List<List<Integer>> result = new ArrayList<>();
private Deque<Integer> path = new ArrayDeque<>();
private boolean[] used;
public List<List<Integer>> permuteUnique(int[] nums) {
Arrays.sort(nums);
used = new boolean[nums.length];
dfs(nums);
return result;
}
void dfs(int[] nums){
if(path.size() == nums.length){
result.add(new ArrayList<>(path));
return;
}
for(int i = 0; i < nums.length; i++){
if(i != 0 && nums[i - 1] == nums[i] && !used[i - 1]){
continue;
}
if(!used[i]){
path.addLast(nums[i]);
used[i] = true;
dfs(nums);
used[i] = false;
path.removeLast();
}
}
}
}