![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
回溯
圆滚滚的柴柴
这个作者很懒,什么都没留下…
展开
-
leetcode Java:52. N皇后 II
题目:52. N皇后 II 思路:回溯。 不需要打印棋盘,所以只需要一个变量记录找到的解即可。 代码: class Solution { public int res = 0; public int totalNQueens(int n) { int[] queen = new int[n]; Arrays.fill(queen, -1); backtrack(queen, 0, n); return res; }原创 2021-03-15 14:39:42 · 73 阅读 · 0 评论 -
leetcode Java:51. N 皇后
题目:51. N 皇后 思路:回溯 用一个n维数组存储皇后位置,数组索引表示皇后所在的行,索引处存的是皇后所在的列,这样很容易保证皇后不在同一行和列,同时需要保证对角线不重复: 两个点(i,j)(k,l): 观察数组不难发现,若两点在斜对角,有i + j == k + l、i - j == k - l,推导可得: i - k == l - j、i - k == j - l 代码: class Solution { public List<List<String>> solve原创 2021-03-12 17:23:37 · 89 阅读 · 0 评论 -
牛客 剑指offer:字符串排列
题目:字符串排列 思路:回溯。 注意对于重复的剪枝:如果某个元素与前一个元素相同,并且前一个元素没有被访问,说明二者在同一层,需要剪枝。 代码: import java.util.*; public class Solution { public ArrayList<String> Permutation(String str) { ArrayList<String> res = new ArrayList<>(); char[]原创 2021-03-10 11:25:49 · 80 阅读 · 0 评论 -
牛客 剑指offer:二叉树根节点到叶子节点的和为定值
题目:二叉树根节点到叶子节点的和为定值 思路:回溯 代码: import java.util.*; /* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; * } */ public class Solution { /** * * @param root TreeNode类 * @param sum int整原创 2021-03-09 17:18:37 · 77 阅读 · 0 评论 -
leetcode Java二刷:47. 全排列 II
题目:47. 全排列 II 思路:回溯。 注意剪枝。 排除重复:如果两个元素相等,前者已经访问,那么说明是不同层的,可以继续回溯;前者没有访问,说明是同一层,则需要剪枝。 代码: class Solution { public List<List<Integer>> permuteUnique(int[] nums) { List<List<Integer>> res = new ArrayList<>();原创 2021-03-04 17:30:05 · 102 阅读 · 1 评论 -
leetcode Java二刷:46. 全排列
题目:46. 全排列 思路:回溯。 新建一个visited数组,表示数字是否使用过。 不使用额外的空间,用原本数字记录是否使用过。这个官方题解 讲的很清楚。把原数组看作2部分,左侧是已经访问过的数字,右侧是待访问的数字。记录当前需要放数字的位置,然后不断交换当前位置的数字与待访问的数字。 代码: class Solution { public List<List<Integer>> permute(int[] nums) { List<List<原创 2021-03-03 17:42:10 · 92 阅读 · 2 评论 -
leetcode Java二刷:40. 组合总和 II
题目: 思路:回溯 仍然,先排序,用目标值不断减去放入结果集合的数字,这样目标值与0比较即可判断是否找到解; 加速剪枝:回溯的过程中,如果目标值减去当前数字小于0,那么后面所有数字都不可能满足条件了(已经排序),此时直接返回; 跟上一题不同的是:数字不能重复使用,所以回溯搜索时要从下一个位置开始。 去重:同层不能有重复,不同层可以重复,即: 不能出现: 可以出现: 如何保证同层不重复呢?candidates[i] == candidates[i - 1],然而这样也会剪掉不同层重复的情况 如何保证不同原创 2021-02-22 15:21:41 · 57 阅读 · 0 评论 -
leetcode Java二刷:39. 组合总和
题目:39. 组合总和 思路:回溯 为了方便后续处理,我们先排序。 我们用目标值不断减去放入结果集合的数字,这样目标值与0比较即可判断是否找到解; 加速剪枝:回溯的过程中,如果目标值减去当前数字小于0,那么后面所有数字都不可能满足条件了(已经排序),此时直接返回; 去重剪枝:这道题,数字可以重复使用,去重剪枝包含两块: (1)对于重复的数字,我们只考虑第一个,其余的全部跳过; (2)每一次的搜索都从当前位置开始,不考虑当前位置之前的数字,因为之前的数字已经搜索过了。 例1:1113,targe原创 2021-02-22 14:55:02 · 53 阅读 · 0 评论 -
leetcode Java二刷:37. 解数独
题目:37. 解数独 思路:回溯。 在每一个空格处尝试放入1~9,需要注意的是,如果找到解就不回溯了,因为我们要把解存在原来的数据结构里。 代码: class Solution { private boolean[][] row = new boolean[9][9]; private boolean[][] col = new boolean[9][9]; private boolean[][] box = new boolean[9][9]; public vo原创 2021-02-21 15:35:47 · 73 阅读 · 0 评论 -
leetcode Java二刷:22. 括号生成
题目:22. 括号生成 思路:回溯。 左括号和右括号最多n个; 如果已经使用的左括号小于n,那我们还可以使用左括号; 如果已经使用的右括号小于n,那我们也还可以使用右括号; 注意剪枝:如果剩余可使用的左括号小于右括号,那么此时不满足条件,因为有一个右括号提前在左括号之前被使用了。 代码: class Solution { public List<String> generateParenthesis(int n) { List<String> res =原创 2021-01-13 17:47:26 · 54 阅读 · 0 评论 -
leetcode Java二刷:17. 电话号码的字母组合
题目:17. 电话号码的字母组合 思路:回溯。 代码: class Solution { public List<String> letterCombinations(String digits) { Map<Character, String> map = new HashMap<>(); map.put('2', "abc"); map.put('3', "def"); map.put('4',原创 2021-01-11 19:05:57 · 53 阅读 · 0 评论