tag回溯-刷题预备知识-1. 回溯法模板, + lt.46. 全排列

回溯算法比较像之前提到过的DFS 算法,本质上就是一种暴力穷举算法。

解决一个回溯问题,实际上就是一个决策树的遍历过程。

回溯解决了什么问题?

img

如何理解回溯法

img

回溯算法模板

img

lt.46. 全排列

img

[思路分析一, 回溯模板]

[代码实现]

class Solution {
    List<List<Integer>> lists = new ArrayList<>();

    public List<List<Integer>> permute(int[] nums) {
        //记录叶子结点路径的list
        List<Integer> path = new ArrayList<>();

        //记录的是遍历一条路径, 在这条路径上的节点是否被使用
        boolean[] used = new boolean[nums.length]; 

        backTracking(nums, path, used);

        return lists;
    }
    
    //1. 递归函数, 回溯所有节点的组合路径. 
    //参数: path是记录每一个子路径, used标记某个节点是否被使用
    public void backTracking(int[] nums, List<Integer> path, boolean[] used){
        //2. 递归结束条件
        // path中记录的路径等于选择列表的长度
         //nums数组中是用到的选择如1,2,3/ path是记录到了叶子结点才会等于nums的长度
        if(path.size() == nums.length){ 
            lists.add(new ArrayList(path)); //?????
            return;
        }  

        //回溯的过程, 
        // for循环广度遍历
        // 回溯负责一条路径的遍历, 然后返回到初始位置
        for(int i = 0; i < nums.length; i++){
            //当前路径节点已经被使用
            if(used[i] == true)continue;
            
            //递进过程, 沿着树节点向深处遍历
            path.add(nums[i]);
            used[i] = true;

            backTracking(nums, path, used);
            
            //--> 每次沿着之前遍历的节点路径向上回溯, 就要删除一个节点
            path.remove(path.size() - 1); /// ????, 
            used[i] = false;

        }
    }
}
posted @   青松城  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示