本文主要是介绍算法通关村第十八关 | 青铜 | 回溯,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1.回溯
回溯可以视为递归的拓展,有着明确的解题模板。
很大的不同之处是有一个撤销处理结果的操作,但是大框架就是遍历 N 叉树。
回溯主要解决暴力枚举都解决不了的问题。
回溯模板:
void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择本层集合中元素(画成树,就是树节点孩子的大小)) {处理节点;backtracking();回溯,撤销处理结果;}
}
回溯完整代码示例:返回 1 到 n 中所有可能的 k 个数的组合
public List<List<Integer>> combine(int n, int k) {List<List<Integer>> resultList = new ArrayList<>();if (k <= 0 || n < k) {return resultList;}Deque<Integer> path = new ArrayDeque<>();dfs(n, k, 1, path, res);return res;
}public void dfs(int n, int k, int startIndex, Deque<Integer> path, List<List<Integer>> resultList) {if (path.size() == k) {resultList.add(new ArrayList<>(path));return;}for (int i = startIndex; i <= n; i++) {path.addLast(i);dfs(n, k, i + 1, path, resultList);path.removeLast();}
}
2.回溯题目:输出二叉树的所有路径
原题:力扣257.
class BinaryTreePaths {List<String> ans = new ArrayList<>();public List<String> binaryTreePaths(TreeNode root) {dfs(root, new ArrayList<>());return ans;}private void dfs(TreeNode root, List<Integer> temp) {if (root == null) {return;}temp.add(root.val);if (root.left == null && root.right == null) {ans.add(getPathString(temp));}dfs(root.left, temp);dfs(root.right, temp);temp.remove(temp.size() - 1);}private String getPathString(List<Integer> temp) {StringBuilder sb = new StringBuilder();sb.append(temp.get(0));for (int i = 1; i < temp.size(); i++) {sb.append("->").append(temp.get(i));}return sb.toString();}
}
3.回溯题目:路径总和问题
原题:力扣113.
class PathSum {List<List<Integer>> res = new ArrayList<>();public List<List<Integer>> pathSum(TreeNode root, int targetSum) {LinkedList<Integer> path = new LinkedList<>();dfs(root, targetSum, path);return res;}public void dfs(TreeNode root, int targetSum, LinkedList<Integer> path) {if (root == null) {return;}targetSum -= root.val;path.add(root.val);if (targetSum == 0 && root.left == null && root.right == null) {res.add(new LinkedList(path));}dfs(root.left, targetSum, path);dfs(root.right, targetSum, path);path.removeLast();}
}
如果对您有帮助,请点赞关注支持我,谢谢! ❤
如有错误或者不足之处,敬请指正! ❤
个人主页:星不易 ❤
算法通关村专栏:不易|算法通关村 ❤
这篇关于算法通关村第十八关 | 青铜 | 回溯的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!