算法-回溯算法
文章平均质量分 50
xushiyu1996818
这个作者很懒,什么都没留下…
展开
-
leetcode-052-n皇后2
回溯的具体做法是:依次在每一行放置一个皇后,每次新放置的皇后都不能和已经放置的皇后之间有攻击,即新放置的皇后不能和任何一个已经放置的皇后在同一列以及同一条斜线上。显然,每个皇后必须位于不同行和不同列,因此将 N 个皇后放置在 N×N 的棋盘上,一定是每一行有且仅有一个皇后,每一列有且仅有一个皇后,且任何两个皇后都不能在同一条斜线上。为了降低总时间复杂度,每次放置皇后时需要快速判断每个位置是否可以放置皇后,显然,最理想的情况是在 O(1) 的时间内判断该位置所在的列和两条斜线上是否已经有皇后。原创 2023-06-07 20:15:36 · 567 阅读 · 0 评论 -
leetcode-051-n皇后
我们可以先不考虑每一个皇后之间不能相互攻击的条件,如果要求每行只能放一个皇后,我们能否穷举出所有的放置方法?对于每一个格子进行计算分析能不能放置皇后,最后的代码实现会跳过这些格子,把皇后放在合法的位置上。具体的,在每一个位置放置皇后,然后调用 backtrack 函数,进入下一行进行穷举进行判断。因为我们是一行一行从上向下放置皇后,所以下方,左下方和右下方不会有皇后(还没放皇后)。因为我们的逻辑是每一行只放一个皇后,所以这个皇后的左边和右边不需要进行检查了。N 皇后问题也是一个暴力穷举的问题。原创 2023-05-31 23:14:03 · 419 阅读 · 0 评论 -
leetcode-047-全排列2
但是这个相等条件有两种可能 一种是,1 1‘ 2,也就是选择完1之后再选择第二个1,两个元素虽然重复,但是第二个元素是前一个元素的下一层,这时是没有问题的。另一种是之前的 同层 分支已经有 1 1‘ 2了,这次的选择是 1‘ 1 2。那就说明是重复分支。具体区分的办法是 nums[i-1] 的used状态是被选择的,那么说明当前的nums[i] 是 nums[i-1]的下一层路径。否则如果 nums[i-1] 的状态是没被选择的,那么说明当前 的nums[i] 是nums[i-1] 同层路径。原创 2023-05-20 16:45:55 · 100 阅读 · 0 评论 -
leetcode-040-组合总和2
很容易想到的方案是:先对数组 升序 排序,重复的元素一定不是排好序以后相同的连续数组区域的第 11 个元素。也就是说,剪枝发生在:同一层数值相同的结点第 22、33 ... 个结点,因为数值相同的第 11 个结点已经搜索出了包含了这个数值的全部结果,同一层的其它结点,候选数的个数更少,搜索出的结果一定不会比第 11 个结点更多,并且是第 11 个结点的子集。这里我们使用和第 39 题和第 15 题(三数之和)类似的思路:不重复就需要按 顺序 搜索, 在搜索的过程中检测分支是否会出现重复结果。原创 2023-05-08 22:48:19 · 661 阅读 · 0 评论 -
leetcode-037-解数独
尝试去填充数组,只要行,列, 还有 3*3 的方格内 出现已经被使用过的数字,我们就不填充,否则尝试填充。声明布尔数组,表明行列中某个数字是否被使用了, 被用过视为 true,没用过为 false。我们尝试填充,如果发现重复了,那么擦除重新进行新一轮的尝试,直到把整个数组填充完成。类似人的思考方式去尝试,行,列,还有 3*3 的方格内数字是 1~9 不能重复。数独首先行,列,还有 3*3 的方格内数字是 1~9 不能重复。如果填充失败,那么我们需要回溯。初始化布尔数组,表明哪些数字已经被使用过了。原创 2023-05-07 17:49:37 · 124 阅读 · 0 评论 -
剑指offer-28-字符串的排列-java
题目及测试package sword028;/* 输入一个字符串,按字典序打印出该字符串中字符的所有排列。 * 例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。*/import java.util.List;public class main { public static void main(String[] args) { String[] testTable = {"24","aabc","abc原创 2020-12-05 11:19:19 · 185 阅读 · 0 评论 -
leetcode-39-组合总和-java
题目及测试package pid039;/* 39. 组合总和给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。说明: 所有数字(包括 target)都是正整数。 解集不能包含重复的组合。 示例 1:输入:candidates = [2,3,6,7], target = 7,所求解集为:[ [7],原创 2020-07-28 14:25:04 · 206 阅读 · 0 评论 -
leetcode-10-正则表达式匹配-java
题目及测试package pid010;/*正则表达式匹配给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。'.' 匹配任意单个字符'*' 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。说明: s 可能为空,且只包含从 a-z 的小写字母。 p 可能为空,且只包含从...原创 2020-01-06 13:39:00 · 136 阅读 · 0 评论 -
leetcode-44-通配符匹配-java
题目及测试package pid044;/*通配符匹配给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 '?' 和 '*' 的通配符匹配。'?' 可以匹配任何单个字符。'*' 可以匹配任意字符串(包括空字符串)。两个字符串完全匹配才算匹配成功。说明: s 可能为空,且只包含从 a-z 的小写字母。 p 可能为空,且只包含从 a-z 的小写字...原创 2020-01-03 10:07:13 · 567 阅读 · 0 评论 -
leetcode-301-删除无效的括号-java
题目及测试package pid301;/* Remove Invalid Parentheses删除最小数量的无效括号,使得输入的字符串有效,返回所有可能的结果。说明: 输入可能包含了除 ( 和 ) 以外的字符。示例 1:输入: "()())()"输出: ["()()()", "(())()"]示例 2:输入: "(a)())()"输出: ["(a)()()"...原创 2019-12-27 13:42:33 · 431 阅读 · 0 评论 -
leetcode-212-单词搜索 II-java
题目及测试package pid212;import java.util.List;/*单词搜索 II给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用。示例:...原创 2019-12-26 11:20:10 · 164 阅读 · 0 评论 -
leetcode-131-分割回文串-java
题目及测试package pid131;/* 分割回文串给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。返回 s 所有可能的分割方案。示例:输入: "aab"输出:[ ["aa","b"], ["a","a","b"]]*/import java.util.List;public class main { public ...原创 2019-12-24 14:06:18 · 224 阅读 · 0 评论 -
回溯算法总结
目录回溯算法简介回溯算法中的三个概念回溯算法的步骤具体流程代码实现框架经典例子选取数字集合皇后问题最大 k 乘积问题回溯算法简介回溯法是一种类似枚举的搜索尝试过程,既然是枚举,那么就会遍历解空间树中的所有解(或者是“路径”),搜索的过程按照DFS原则,而尝试就意味着,在遍历的过程中,有可能到达某一个结点后,发现不能够满足约束条件,在这次尝试中,这条“路”...原创 2019-06-10 16:42:55 · 1736 阅读 · 0 评论 -
leetcode-79-单词搜索(word search)-java
题目及测试package pid079;import java.util.List;/*单词搜索给定一个二维网格和一个单词,找出该单词是否存在于网格中。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。示例:board =[ ['A','B','C','E'], ['...原创 2018-11-28 10:31:33 · 534 阅读 · 0 评论 -
leetcode-78-子集(subsets)-java
题目及测试package pid078;import java.util.List;/*子集给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。示例:输入: nums = [1,2,3]输出:[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2],...原创 2018-11-27 11:33:22 · 561 阅读 · 0 评论 -
leetcode-46-全排列(permutations)-java
题目及测试package pid046;import java.util.List;/*全排列给定一个没有重复数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]]*/public class main { ...原创 2018-11-26 10:32:39 · 507 阅读 · 0 评论 -
leetcode-22-括号生成(generate parentheses)-java
题目及测试package pid022;/* 生成括号给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。例如,给出 n = 3,生成结果为:[ "((()))", "(()())", "(())()", "()(())", "()()()"]*/import java.util.List;publi...原创 2018-11-23 09:52:05 · 269 阅读 · 0 评论 -
leetcode-回溯算法总结
leetcode-17-电话号码的字母组合(letter combination of a phone number)-java在类中建立一个数字对应字母的map,和对应的结果list方法1:进入combine("",digits)第一个字符串为当前字符串,后面的为还能加上的数字字符串每次从数组字符串中取最前一位,得到对应的char数组,将nowStr+对应的数组(用for循环,分别...原创 2018-11-22 10:39:32 · 995 阅读 · 1 评论 -
leetcode-17-电话号码的字母组合(letter combination of a phone number)-java
题目及测试package pid017;/* 电话号码的字母组合给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 2 abc 3 def 4 ghi 5 jkl 6 mno 7 pqrs 8 tuv 9 wxyz示例:输入:"23"输出:["ad", "ae", "af"...原创 2018-11-22 10:38:05 · 429 阅读 · 0 评论