随笔分类 - AL_Backtracking
摘要:47. 全排列 II 题意 给定一个可包含重复数字的序列,返回所有不重复的全排列。 示例: 解题思路 去重的全排列就是从第一个数字起每个数分别与它后面非重复出现的数字交换。用编程的话描述就是第i个数与第j个数交换时,要求[i,j)中没有与第j个数相等的数。有两种方法(1)可以每次在需要交换时进行顺序
阅读全文
摘要:39. 组合总和 题意 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的数字可以无限制重复被选取。 说明: 所有数字(包括 target)都是正整数。解集不能包含重复的组
阅读全文
摘要:24. 两两交换链表中的节点 题意 两两交换链表中的结点 解题思路 递归找终止条件:本题终止条件很明显,当递归到链表为空或者链表只剩一个元素的时候,没得交换了,自然就终止了。找返回值:回给上一层递归的值应该是已经交换完成后的子链表。单次的过程:因为递归是重复做一样的事情,所以从宏观上考虑,只用考虑某
阅读全文
摘要:Word Break 单词分解 题意:这道题的思路和前面一道也是字符串的切分的题目的思路是一样的,这里是判断当前的字符串是否是字典中给定的字符串来组成。 回溯 回溯方法,可以用idx,也可以用当前子串的形式。 class Solution(object): def wordBreak(self, s
阅读全文
摘要:Unique Binary Search Trees II 唯一二叉树2 思路:利用回溯的思想,以其中一个值作为根结点,两边分别作为左结点和右结点的值。 class Solution(object): def generateTrees(self, n): """ :type n: int :rty
阅读全文
摘要:109. 有序链表转换二叉搜索树 回溯 这里比较难的点在于,如何去区分左子树和右子树,因为不可能像数组那样简单的分片操作,那么可以使用变量标记起始和终点即可。 或者把回调函数提取出来: 然后也可以将链表转化成数组,变成控制数组的左右区间,然后再进行操作:
阅读全文
摘要:110. Balanced Binary Tree 题意:判断树是否是平衡树,平衡树的定义是任何一个结点的左子树和右子树高度差不超过1; 思路:既然是要求每个结点,那么就要dfs每个结点,然后比较它们的左右子结点的高度差即可。 class Solution(object): def isBalanc
阅读全文
摘要:10. 正则表达式匹配 题意 给定一个字符串 (s) 和一个字符模式 (p)。实现支持 '.' 和 '*' 的正则表达式匹配。 匹配应该覆盖整个字符串 (s) ,而不是部分字符串。 说明: s 可能为空,且只包含从 a-z 的小写字母。p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和
阅读全文
摘要:77. 组合 题意 给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。 示例: 解题思路 超时了,于是我想到了之前一种比较巧妙的迭代方法,可以获取到第index的内容,如下: 实现 不像排列,任意位置进行交换,组合只能是按照顺序的。 使用原生的combinations来实
阅读全文
摘要:79. Word Search 题意:判断某个字符串是否按照数组中相邻的顺序,同时同一个位置的字符不能使用两次。 个人觉得这道题真的非常回溯,很典型的回溯思想。 回溯 思路:先遍历找到起始字符,然后利用回溯来确定是否符合题目条件,因为题目要求不能重复使用,所以我用一个set来纪录使用过的字符的坐标。
阅读全文
摘要:131. Palindrome Partitioning 回溯 直接在s上进行操作。 class Solution(object): def partition(self, s): """ :type s: str :rtype: List[List[str]] """ def backtracki
阅读全文
摘要:216. 组合总和 III 题意 找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。说明:所有数字都是正整数。解集不能包含重复的组合。 示例 1:输入: k = 3, n = 7输出: [[1,2,4]]示例 2:输入: k = 3,
阅读全文
摘要:46. 全排列 题意 给定一个没有重复数字的序列,返回其所有可能的全排列。 示例: 解题思路 回溯:遍历数组,两两交换给定对应下标的值; 记忆化:通过遍历当前路径数组,遍历当前的路径数组选择位置来插入index对应的值实现; 实现
阅读全文
摘要:22. Generate Parentheses 题意:给定括号个数,生成相互对应的括号组合。 回溯 纪录两边的括号的个数,注意每当右边括号数目和左边数目不再相等的时候,那么需要进行补齐右边的括号。 增加的形式: class Solution(object): def generateParenth
阅读全文
摘要:90. 子集 II 题意 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。 说明:解集不能包含重复的子集。 示例: 解题思路 因为加进了重复元素,那么就有可能出现重复的子集,需要在加入到结果之前进行判断是否存在(首先要进行排序,保证每个子集都是有序的),使用的思路和1
阅读全文
摘要:78. 子集 题意 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。 说明:解集不能包含重复的子集。 示例: 解题思路 回溯:每一次递归都把当前的路径数组加入到最终的结果中,同时维护一个index,将index的值加入到当前路径数组中,将index+1往后递归; 迭代实现
阅读全文
摘要:40. 组合总和 II 题意 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用一次。 说明: 所有数字(包括目标数)都是正整数。解集不能包含重复的组合。
阅读全文
摘要:39. Combination Sum 注意,题目中允许使用数组中任意值多次,不受限制,一开始的时候就因为这个卡住了,不知道应该怎么做,但有一个大概的思路就是,DFS是肯定要的了,看了别人的题解才知道怎么做。 1. DFS class Solution(object): def combinatio
阅读全文