
回溯
圆滚滚的柴柴
这个作者很懒,什么都没留下…
展开
-
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 · 120 阅读 · 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 · 117 阅读 · 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 · 128 阅读 · 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 · 123 阅读 · 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 · 141 阅读 · 1 评论 -
leetcode Java二刷:46. 全排列
题目:46. 全排列思路:回溯。新建一个visited数组,表示数字是否使用过。不使用额外的空间,用原本数字记录是否使用过。这个官方题解 讲的很清楚。把原数组看作2部分,左侧是已经访问过的数字,右侧是待访问的数字。记录当前需要放数字的位置,然后不断交换当前位置的数字与待访问的数字。代码:class Solution { public List<List<Integer>> permute(int[] nums) { List<List<原创 2021-03-03 17:42:10 · 132 阅读 · 2 评论 -
leetcode Java二刷:40. 组合总和 II
题目:思路:回溯仍然,先排序,用目标值不断减去放入结果集合的数字,这样目标值与0比较即可判断是否找到解;加速剪枝:回溯的过程中,如果目标值减去当前数字小于0,那么后面所有数字都不可能满足条件了(已经排序),此时直接返回;跟上一题不同的是:数字不能重复使用,所以回溯搜索时要从下一个位置开始。去重:同层不能有重复,不同层可以重复,即:不能出现:可以出现:如何保证同层不重复呢?candidates[i] == candidates[i - 1],然而这样也会剪掉不同层重复的情况如何保证不同原创 2021-02-22 15:21:41 · 81 阅读 · 0 评论 -
leetcode Java二刷:39. 组合总和
题目:39. 组合总和思路:回溯为了方便后续处理,我们先排序。我们用目标值不断减去放入结果集合的数字,这样目标值与0比较即可判断是否找到解;加速剪枝:回溯的过程中,如果目标值减去当前数字小于0,那么后面所有数字都不可能满足条件了(已经排序),此时直接返回;去重剪枝:这道题,数字可以重复使用,去重剪枝包含两块:(1)对于重复的数字,我们只考虑第一个,其余的全部跳过;(2)每一次的搜索都从当前位置开始,不考虑当前位置之前的数字,因为之前的数字已经搜索过了。例1:1113,targe原创 2021-02-22 14:55:02 · 78 阅读 · 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 · 93 阅读 · 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 · 89 阅读 · 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 · 77 阅读 · 0 评论