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

有重复项数字的全排列

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

}

全部评论

相关推荐

06-10 21:15
门头沟学院 Java
宁阿:好多这种没🧠的公司,他们估计都不知道毕业的人不能给安排实习岗
实习吐槽大会
点赞 评论 收藏
分享
zYvv:双一流加大加粗再标红,然后广投。主要是获奖荣誉不够,建议开始不用追求大厂,去别的厂子刷下实习。
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务