tag回溯-刷题预备知识-1. 回溯法模板, + lt.46. 全排列
回溯算法比较像之前提到过的DFS 算法,本质上就是一种暴力穷举算法。
解决一个回溯问题,实际上就是一个决策树的遍历过程。
回溯解决了什么问题?
如何理解回溯法
回溯算法模板
lt.46. 全排列
[思路分析一, 回溯模板]
[代码实现]
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;
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律