
回溯算法
文章平均质量分 63
嘻嘻哈哈樱桃
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
全排列II力扣--47
大家应该很清晰的看到,树层上对前一位去重非常彻底,效率很高,树枝上对前一位去重虽然最后可以得到答案,但是做了很多无用搜索。得一直是 true 或者一直是false 才可以,而不是 一会是true 一会又是false。来来来,我就用输入: [1,1,1] 来举一个例子。那如果都可以,直接去掉哪个条件可以吗?给定一个可包含重复数字的序列。返回所有不重复的全排列。这么说是不是有点抽象?原创 2025-02-25 15:58:00 · 392 阅读 · 0 评论 -
全排序力扣--46
给定一个不含重复数字的数组nums,返回其所有可能的全排列。你可以返回答案。原创 2025-02-25 15:14:29 · 153 阅读 · 0 评论 -
非递减子序列力扣--491
目录题目思路代码给你一个整数数组 ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。示例 1:输入:nums = [4,6,7,7]输出:[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]示例 2:输入:nums = [4,4,3,2,1]输出:[[4,4]]思路看到的第一反应是先排序,原创 2025-02-25 14:50:46 · 244 阅读 · 0 评论 -
子集II力扣--90
其中可能包含重复元素,请你返回该数组所有可能的 子集(幂集)。返回的解集中,子集可以按。原创 2025-02-24 17:08:10 · 216 阅读 · 0 评论 -
复原IP地址力扣--93
切割的线用startIndex来记录,还需要一个变量pointNum,记录添加逗点的数量。运算符将上述三个部分连接起来,形成一个新的字符串。方法只接受一个参数时,它表示从指定的索引开始截取到字符串的末尾。表示截取的起始索引(包含该索引对应的字符),第二个参数。开始,截取到字符串的末尾,得到一个新的子字符串。表示截取的结束索引(不包含该索引对应的字符)。,用以表示一个 IP 地址,返回所有可能的。类的一个方法,用于截取字符串的一部分。最后,将连接好的新字符串重新赋值给变量。的字符,得到一个新的子字符串。原创 2025-02-24 10:42:09 · 449 阅读 · 0 评论 -
子集力扣--78
返回该数组所有可能的子集(幂集)。原创 2025-02-24 16:27:55 · 298 阅读 · 0 评论 -
分割回文串力扣--131
循环中,我们 定义了起始位置startIndex,那么 [startIndex, i] 就是要截取的子串。从树形结构的图中可以看出:切割线切到了字符串最后面,说明找到了一种切割方法,此时就是本层递归的终止条件。首先判断这个子串是不是回文,如果是回文,就加入在。首先第一个难点是把回文和回溯算法联系在一起。递归函数参数还需要startIndex,中,path用来记录切割过的回文子串。分割成一些子串,使每个子串都是。所有可能的分割方案。原创 2025-02-20 10:22:56 · 283 阅读 · 0 评论 -
组合总和II力扣--40
对于回溯的参数传递:因为有相同元素,所以需要定义一个used数组,来标记,这个数字是否使用过。要去重的是“同一树层上的使用过”,如何判断同一树层上元素(相同的元素)是否使用过了呢。candidate中的元素可以重复,但是结果中的组合不能重复(此时for循环里就应该做continue的操作。中的每个数字在每个组合中只能使用。首先对数组排序,使得相同的元可以相邻。给定一个候选人编号的集合。解集不能包含重复的组合。中所有可以使数字和为。原创 2025-02-20 09:14:17 · 462 阅读 · 0 评论 -
组合总和力扣--39
本题没有组合数量要求,仅仅是总和的限制,所以递归没有层数的限制,只要选取的元素总和超过target,就返回!和前面的组合问题不同的是,最后的结果集里的数字可以有重复比如target是4,结果集可以是2,2。如果是多个集合取组合,各个集合之间相互不影响,那么就不用startIndex,例如:力扣17。2 和 3 可以形成一组候选,2 + 2 + 3 = 7。如果是一个集合来求组合的话,就需要startIndex,例如:力扣77和216.如果至少一个数字的被选数量不同,则两种组合是不同的。原创 2025-02-19 10:25:43 · 339 阅读 · 0 评论 -
电话号码的字母组合力扣--17
图中可以看出遍历的深度,就是输入"23"的长度,而叶子节点就是我们要收集的结果,输出["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]。这个index是记录遍历第几个数字了,就是用来遍历digits的(题目中给出数字字符串),同时index也表示树的深度。需要index来记录,比如他是2和3,,需要记录他到2了还是到3了,所以index用来记录到2还是3。例如输入用例"23",两个数字,那么根节点往下递归两层就可以了,叶子节点就是要收集的结果集。原创 2025-02-19 09:48:33 · 295 阅读 · 0 评论 -
力扣216--组合总和III
在[1,9]范围内使用4个不同的数字,我们可以得到的最小和是1+2+3+4 = 10,因为10 > 1,没有有效的组合。要找到和为n的k个数的组合,而整个集合已经是固定的了[1,...,9]。该列表不能包含相同的组合两次,组合可以以任何顺序返回。所有可能的有效组合的列表。没有其他符合的组合了。没有其他符合的组合了。原创 2025-02-17 17:41:56 · 328 阅读 · 0 评论 -
力扣77--组合
给定两个整数n和k,返回范围[1, n]中所有可能的k个数的组合。你可以按返回答案。原创 2025-02-17 11:09:05 · 668 阅读 · 0 评论 -
回溯算法理论基础
例如:{1, 2} 和 {2, 1} 在组合上,就是一个集合,因为不强调顺序,而要是排列的话,{1, 2} 和 {2, 1} 就是两个集合了。因为回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案,如果想让回溯法高效一些,可以加一些剪枝的操作,但也改不了回溯法就是穷举的本质。什么时候达到了终止条件,树中就可以看出,一般来说搜到叶子节点了,也就找到了满足条件的一条答案,把这个答案存放起来,并结束本层递归。回溯算法需要的参数不易确定,所以一般是先写逻辑,然后需要什么参数,就填什么参数。原创 2025-02-01 17:09:30 · 473 阅读 · 0 评论