回溯算法
kkkkuuga
这个作者很懒,什么都没留下…
展开
-
leetcode139. 单词拆分
1.题目描述:给你一个字符串s和一个字符串列表wordDict作为字典。请你判断是否可以利用字典中出现的单词拼接出s。注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。2.动态规划:这道题实际是代码随想录背包问题模块的最后一题,首先是完全背包,其次与先前的求组合及求排列的背包问题都有所不同,他是求一种特定的排列,因此只能先遍历背包再遍历物品,否则虽然先遍历的物品可以当次重复遍历,但无法在下次遍历出现,也就是示例2输出false。个人感觉代码随想录这里出错了,也有可能是我写原创 2022-03-21 11:36:17 · 593 阅读 · 0 评论 -
leetcode140. 单词拆分 II
给定一个字符串s和一个字符串字典wordDict,在字符串s中增加空格来构建一个句子,使得句子中所有的单词都在词典中。以任意顺序返回所有这些可能的句子。注意:词典中的同一个单词可能在分段中被重复使用多次。...原创 2022-08-14 21:55:28 · 354 阅读 · 1 评论 -
leetcode473. 火柴拼正方形
你将得到一个整数数组matchsticks,其中matchsticks[i]是第i个火柴棒的长度。你要用所有的火柴棍拼成一个正方形。你不能折断任何一根火柴棒,但你可以把它们连在一起,而且每根火柴棒必须 使用一次。如果你能使这个正方形,则返回true,否则返回false。做法一致,把k改为4即可。...原创 2022-08-10 22:55:47 · 445 阅读 · 0 评论 -
leetcode698. 划分为k个相等的子集
给定一个整数数组nums和一个正整数k,找出是否有可能把这个数组分成。个非空子集,其总和都相等。原创 2022-08-10 11:05:22 · 573 阅读 · 0 评论 -
leetcode37. 解数独
编写一个程序,通过填充空格来解决数独问题。数独的解法需遵循如下规则数字1-9在每一行只能出现一次;数字1-9在每一列只能出现一次;数字1-9在每一个以粗实线分隔的3x3宫内只能出现一次;数独部分空格内已填入了数字,空白格用'.'表示。双层for循环首先找到空的位置,再一个for循环开始1-9数字的递归回溯。因为解数独找到一个符合的条件(就在树的叶子节点上)立刻就返回,相当于找从根节点到叶子节点一条唯一路径,所以需要使用返回值。...原创 2022-03-01 09:25:38 · 274 阅读 · 0 评论 -
leetcode51. N 皇后
n皇后问题研究的是如何将n个皇后放置在n×n的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数n,返回所有不同的n皇后问题的解决方案。每一种解法包含一个不同的n皇后问题的棋子放置方案,该方案中'Q'和'.'分别代表了皇后和空位。,自己写的代码维护了一个int[][]二维数组用来记录棋盘是否已经放过棋子并根据此来写for循环里落棋的判断代码,细节直接见代码备注。其他解法可以把定义的二维数组arr直接当作棋盘最终结果返回,判断皇后能否放入抽取成其他方法。首先皇后的攻击范围,横竖对角呈“米”字,然后本题。..原创 2022-02-28 11:46:44 · 731 阅读 · 0 评论 -
leetcode47. 全排列 II
基础上增加去重操作,由于数组包含重复元素,不能用全排列中list.contains()方法,在原代码基础上套入。给定一个可包含重复数字的序列nums,按任意顺序返回所有不重复的全排列。的使用标记数组去重代码即可。...原创 2022-02-27 20:19:00 · 485 阅读 · 0 评论 -
leetcode46. 全排列
1.题目描述:给定一个不含重复数字的数组nums,返回其所有可能的全排列。你可以按任意顺序返回答案。2.回溯:排列时不能用index来递归下一层,下一层起始仍为0但是要除去先前已经被添加的元素。使用list.contains()方法:class Solution { private List<List<Integer>> resList = new ArrayList<>(); private List<Integer>原创 2022-02-27 18:21:32 · 629 阅读 · 0 评论 -
leetcode491. 递增子序列
1.题目描述:给你一个整数数组nums,找出并返回所有该数组中不同的递增子序列,递增子序列中至少有两个元素。你可以按任意顺序返回答案。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。2.回溯:由于求递增子序列,原数组不能被改动无法排序,并且示例1中4,6,7,7如果不去重那么将会重复输出467、47、67,所以需要去重,但是由于数组未排序去重逻辑和先前遇到的不同leetcode40. 组合总和 II。class Solution { private原创 2022-02-26 23:27:55 · 369 阅读 · 0 评论 -
leetcode90. 子集 II
1.题目描述:给你一个整数数组nums,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。解集不能包含重复的子集。返回的解集中,子集可以按任意顺序排列。2.回溯:去除横向/树层上的重复元素,详细见leetcode40. 组合总和 II。class Solution { private List<List<Integer>> resList = new ArrayList<>(); List<Integer> li原创 2022-02-25 11:44:54 · 233 阅读 · 0 评论 -
leetcode78. 子集
1.题目描述:给你一个整数数组nums,数组中的元素互不相同。返回该数组所有可能的子集(幂集)。解集不能包含重复的子集。你可以按任意顺序返回解集。2.回溯:与组合问题有不同,组合问题相当于求抽象树的叶子节点,而本题是求所有的节点!代码直接套模板。class Solution { private List<List<Integer>> resList = new ArrayList<>(); private List<Intege原创 2022-02-25 09:48:58 · 450 阅读 · 0 评论 -
leetcode93. 复原 IP 地址
有效IP地址正好由四个整数(每个整数位于0到255之间组成,且不能含有前导0),整数之间用'.'分隔。例如"0.1.2.201"和"192.168.1.1"是有效IP地址,但是"0.011.255.245"、"192.168.1.312"和"192.168@1.1"是无效IP地址。给定一个只包含数字的字符串s,用以表示一个IP地址,返回所有可能的有效IP地址,这些地址可以通过在s中插入'.'来形成。一样,分割类型的回溯。难点在于分割后需要加上”.“,并且符合要满足符合ip的条件,细节在代码注释。...原创 2022-02-24 17:06:16 · 606 阅读 · 0 评论 -
leetcode131. 分割回文串
1.题目描述:给你一个字符串s,请你将s分割成一些子串,使每个子串都是回文串。返回s可能的分割方案。回文串是正着读和反着读都一样的字符串。2.回溯:关键在于抽取回溯/树型结构的模型。组合问题:选取一个a之后,在ab中再去选取第二个,选取a之后在b中再选组第三个.....。切割问题:切割一个a之后,在ab中再去切割第二段,切割a之后在b中在切割第三段.....。不同之处在于第一次除了切割a,可以切割aa,可以切割aab,需要获取被切割的字符串,这相当于树层的广度放在循环中,上限为字符串长度,下原创 2022-02-23 15:04:32 · 286 阅读 · 0 评论 -
leetcode17. 电话号码的字母组合
1.题目描述:给定一个仅包含数字2-9的字符串,返回所有它能表示的字母组合。答案可以按任意顺序返回。给出数字到字母的映射如下(与电话按键相同)。注意1不对应任何字母。2.回溯:这道题有几个注意点:①、每个数字对应的字符串相当于一个集合,这题是求不同集合之间的组合,根前面做的有区别,深度为输入数字也就是输入字符串的长度,广度为单个数字代表的字符串长度(如abc),回溯终止条件为深度达到了输入字符串的长度,需要借助变量index。②、输入数字其实包含了一个先后顺序的关系,也就是此题不会出现重复结原创 2022-02-22 20:38:31 · 177 阅读 · 0 评论 -
leetcode40. 组合总和 II
1.题目描述:给定一个候选人编号的集合candidates和一个目标数target,找出candidates中所有可以使数字和为target的组合。candidates中的每个数字在每个组合中只能使用一次。注意:解集不能包含重复的组合。2.当开始写的回溯代码(已完成剪枝):类似的题型做多了直接按照模板写。一跑发现有重复的结果。原因是此题数组元素会有重复的,[10,1,2,7,6,1,5]排序后[1,1,2,5,6,7,10],[1,2,5]和[1,7]会出现两次,这里的1两次分别是索引0原创 2022-02-22 14:48:26 · 506 阅读 · 0 评论 -
leetcode39. 组合总和
1.题目描述:给你一个无重复元素的整数数组candidates和一个目标整数target,找出candidates中可以使数字和为目标数target的所有不同组合,并以列表形式返回。你可以按任意顺序返回这些组合。candidates中的同一个数字可以无限制重复被选取。如果至少一个数字的被选数量不同,则两种组合是不同的。对于给定的输入,保证和为target的不同组合数少于150个。2.回溯:class Solution { private List<List<Intege原创 2022-02-22 12:48:44 · 721 阅读 · 0 评论 -
leetcode216. 组合总和 III
1.题目描述:找出所有相加之和为n的k个数的组合。组合中只允许含有1-9的正整数,并且每种组合中不存在重复的数字。说明:所有数字都是正整数;解集不能包含重复的组合。2.回溯:解法与图解leetcode77. 组合几乎一样。class Solution { private List<List<Integer>> resList = new ArrayList<>(); private List<Integer> list =原创 2022-02-21 20:56:04 · 189 阅读 · 0 评论 -
图解leetcode77. 组合
1.题目描述:给定两个整数n和k,返回范围[1,n]中所有可能的k个数的组合。你可以按任何顺序返回答案。2.回溯算法概述:①回溯算法的本质是穷举,穷举所有可能,然后选出我们想要的答案,可以加入剪枝操作提高效率。②回溯算法解决的问题都可以抽象为树形结构,回溯算法解决的都是在集合中递归查找子集,集合的大小(包括每级递归的子集合)为树的宽度,递归的层数为树的深度。递归存在终止条件,所以抽象树是一棵高度有限的N叉树。③回溯算法抽象树示意图+代码框架(类似递归三部曲)。上述部分参考代码随想录。原创 2022-02-21 18:04:48 · 293 阅读 · 0 评论