题解 |回溯解法,清晰易懂
有重复项数字的全排列
http://www.nowcoder.com/practice/a43a2b986ef34843ac4fdd9159b69863
- 终止条件: 排列的数量等于数组的长度,向结果集中加入
- 递归条件: 如果组合的长度还没达到,并且在这个递归里,该位置元素还没被访问过
- 回溯:将当前步骤的在递归结束之后回退
public class Solution {
static ArrayList<ArrayList<Integer>> res = new ArrayList<>();
public static ArrayList<ArrayList<Integer>> permuteUnique(int[] num) {
// 排序方便字典序上升
Arrays.sort(num);
find(num, new ArrayList<>(), new ArrayList<>());
return res;
}
public static void find(int[] num, ArrayList<Integer> path, ArrayList<Integer> indexs ){
// 递归终止条件
if (path.size()==num.length){
if (!res.contains(new ArrayList<>(path))){
res.add(new ArrayList<>(path));
}
return;
}
for (int i=0;i<num.length;i++){
if (path.size()<= num.length && !indexs.contains(i)){
// 在路径中加入这条记录
path.add(num[i]);
// 保存访问过的节点
indexs.add(i);
find(num,path,indexs);
// 复原回溯
path.remove(path.size()-1);
// 复原回溯
indexs.remove(indexs.size()-1);
}
}
}
}