随笔分类 -  回溯算法

摘要:class Solution: def maxCoins(self, nums: List[int]) -> int: # DP 因为dp[left][right] = argmax(dp[left][i]+dp[i][right]+left*i*right) # 这个遍历顺序就是,先中间,后两边 阅读全文
posted @ 2020-12-21 15:13 ChevisZhang 阅读(144) 评论(0) 推荐(0)
摘要:https://leetcode-cn.com/problems/word-break-ii/ class Solution: def wordBreak(self, s: str, wordDict: List[str]) -> List[str]: # 本题就是加上剪枝的回溯算法 # recor 阅读全文
posted @ 2020-12-21 10:04 ChevisZhang 阅读(90) 评论(0) 推荐(0)
摘要: 阅读全文
posted @ 2020-09-23 09:36 ChevisZhang 阅读(81) 评论(0) 推荐(0)
摘要:思路: 1. 矩阵搜索,没有规定起始位置与终止位置的时间复杂度是 O(row*col*3^k)因为要遍历每一个位置作为起始节点,由于不能访问visited,所以每一步都只有3个选择,然后最差情况走完k-1步发现不匹配 2. visited细节 1)visited 用set,而不新建一个borad或在 阅读全文
posted @ 2020-09-17 10:30 ChevisZhang 阅读(92) 评论(0) 推荐(0)
摘要:递归细节: 1. 二叉平衡树,我们需要返回True,False,肯定是用左右子树的深度Depth来判断,怎么在递归中传递深度,且传递布尔值呢 2. 这里做了一个很巧妙的转换,可以用深度来表示True与False,因为深度是非负数,可以用负数表示False,所以我们在递归中就可以只传递深度 3. 递归 阅读全文
posted @ 2020-09-08 12:11 ChevisZhang 阅读(140) 评论(0) 推荐(0)
摘要:N皇后递归细节: 1. 递归的是层数,每一层的递归分支是列数,所以以后有两个变量的递归,或者二维数组的递归,可以固定一个维度,另一个维度作为递归分支 2. 递归出口 row ==n ,就是每一步都成功了,才会row+=1 这个要理解,不然递归出口很难想 3. 剪枝,那一列,对角线,已经有queen占 阅读全文
posted @ 2020-09-08 11:32 ChevisZhang 阅读(88) 评论(0) 推荐(0)
摘要:回溯算法细品 1. 对于回溯携带的变量,以前二叉树中是curNode,curList一起带着回溯的; 而在List中,有Row与Col这里是按Row回溯的,最后的交付物queens则保存在外层 阅读全文
posted @ 2020-09-07 12:49 ChevisZhang 阅读(143) 评论(0) 推荐(0)
摘要: 阅读全文
posted @ 2020-09-07 10:32 ChevisZhang 阅读(130) 评论(0) 推荐(0)
摘要:本题的交付条件不是List(路径节点),也不是num路径总和,而是一个布尔值 解题思路: 1. 由于交付布尔值,且递归路径明显两条,所以 return helper(left,sum) or helper(right,sum) 2. 递归边界: 1)没有子节点时,判断和是否相等 2) if not 阅读全文
posted @ 2020-09-07 10:05 ChevisZhang 阅读(137) 评论(0) 推荐(0)
摘要:1. 回溯算法超时 时间复杂度 n! 爆炸 - - 阅读全文
posted @ 2020-09-04 11:19 ChevisZhang 阅读(131) 评论(0) 推荐(0)
摘要:回溯算法: 1. 本题的deliverable是所有路径的组合,也没有任何剪枝 2. 开始先判空,if not root: return 0 3. 回溯路径 root.left,root.right ; 每次往下层递归,则加上本层的root.val 4. 更新常数的时候要用全局变量 阅读全文
posted @ 2020-09-04 10:20 ChevisZhang 阅读(101) 评论(0) 推荐(0)
摘要:回溯细节: 1. 以往的deliverable都是一些数字的组合,str的组合,这题是子树的组合,单个元素都是TreeNode 2. 注意第一步都是判空,if n==0: return[] 3. 递归边界/出口: if left > right: return [None,] ; 如果某节点已经是 阅读全文
posted @ 2020-09-04 10:08 ChevisZhang 阅读(123) 评论(0) 推荐(0)
摘要:回溯算法细节: 1. 回溯边界: node.left == None and node.right == None 2. 回溯路径:如果有左节点就往左边调用helper,如果有右边就往右边调用Helper 3. deliverable: 包含节点value的list 4. 递归更新: 路径的list 阅读全文
posted @ 2020-09-03 11:34 ChevisZhang 阅读(143) 评论(0) 推荐(0)
摘要:回溯算法细节: 1. deliverable 是 255.111.35.1这种IP地址,所以要记录4个数字,返回 ‘.’.join(list) 2. 递归边界是 len(list) ==4 and not remainS 3. 递归路径有三条,一个数字,两个数字,三个数字 4. 剪枝有两种: 1)两 阅读全文
posted @ 2020-09-03 10:50 ChevisZhang 阅读(195) 评论(0) 推荐(0)
摘要:重点: 1. 本题是组合 Cnk ; 而排列是 Ank 时间复杂度 差了一个 k! 2. 这点差异体现在递归时,递归路径的选择,只选取比当前i大的数 curNums[:i] + curNums[i+1:] -> curNums[:i] 回溯算法: 1. 递归出口 : Length == k 2. 递 阅读全文
posted @ 2020-09-01 11:30 ChevisZhang 阅读(252) 评论(0) 推荐(0)
摘要:回溯算法(超时 72/75): 1. 跳出条件: if position == n : self.res =True / if position > n : return 2. 递归条件: 遍历 position 所有可以跳跃的位置 3. 更新条件,这里不再是更新 resList,是更新res, 需 阅读全文
posted @ 2020-08-31 12:17 ChevisZhang 阅读(142) 评论(0) 推荐(0)
摘要:回溯算法重点: 1. 跳出条件,nums中元素用完 2. 递归的岔路: 加入元素/不加入元素 helper(curList+[nums[i]], nums[1:]) / helper(curList, nums[1:] ) 3.如果是求排列问题,则不能sort,因为lists中元素一样,只是排列不一 阅读全文
posted @ 2020-08-31 10:21 ChevisZhang 阅读(118) 评论(0) 推荐(0)
摘要:回溯算法动笔之前需要思考清楚的点: 1. 跳出条件,len(curList) == len(nums) 2. 递归时选择新加入哪些元素 for i in range(len(curNums)): 3. 递归更新条件 helper( curList+[curNums[i]], curNums[:i]+ 阅读全文
posted @ 2020-08-31 10:09 ChevisZhang 阅读(83) 评论(0) 推荐(0)
摘要:本题与第39题唯一差别就是,元素只能用一次,所以递归时候需要加入可用元素列表 candidate helper的重点: 1.跳出条件 sum == target 或 sum > target 2. 递归的选择 candidate 每次都往现有列表中往下延申 candidate个List 阅读全文
posted @ 2020-08-31 09:47 ChevisZhang 阅读(74) 评论(0) 推荐(0)
摘要:重点: 1. 回溯算法要确定跳出条件,什么时候将List加入Res 2. 一般的条件有,元素用完,sum大于target 等 3. 去重方法: list.sort() if list not in res: res.append(list) 阅读全文
posted @ 2020-08-31 09:34 ChevisZhang 阅读(85) 评论(0) 推荐(0)