题解 |回溯解法,清晰易懂

有重复项数字的全排列

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);
            }
        }
    }

}

全部评论

相关推荐

点赞 1 评论
分享
牛客网
牛客企业服务