day19数据结构力扣

张开发
2026/4/19 8:31:31 15 分钟阅读

分享文章

day19数据结构力扣
今天开始学回溯法就是挺难的简单介绍一下回溯法如何理解回溯法回溯法解决的问题都可以抽象为树形结构是的我指的是所有回溯法的问题都可以抽象为树形结构因为回溯法解决的都是在集合中递归查找子集集合的大小就构成了树的宽度递归的深度就构成了树的深度。递归就要有终止条件所以必然是一棵高度有限的树N叉树。回溯法模板carl总结的回溯三部曲1.回溯函数模板返回值以及参数返回值一般是void参数不太容易确定先写逻辑 然后需要什么参数 就加什么参数2.回溯函数终止条件到终止条件之后收集结果3.回溯法一般是在集合中递归搜索集合的大小构成了树的宽度递归的深度构成的树的深度。void backtracking(参数) { if (终止条件) { 存放结果; return; } for (选择本层集合中元素树中节点孩子的数量就是集合的大小) { 处理节点; backtracking(路径选择列表); // 递归 回溯撤销处理结果 } }回溯法一般可以解决如下几种问题组合问题N个数里面按一定规则找出k个数的集合切割问题一个字符串按一定规则有几种切割方式子集问题一个N个数的集合里有多少符合条件的子集排列问题N个数按一定规则全排列有几种排列方式棋盘问题N皇后解数独等等77. 组合题目链接77. 组合 - 力扣LeetCode思路这里我们就是需要控制startindex比如我们把1放到path里面。那接下来就是只能放234.也就是1后面的数字到path中去提交class Solution: def combine(self, n: int, k: int) - List[List[int]]: result [] # 存放结果集 self.backtracking(n, k, 1, [], result) return result def backtracking(self, n, k, startIndex, path, result): if len(path) k: result.append(path[:]) return for i in range(startIndex, n 1): path.append(i) # 处理节点 self.backtracking(n, k, i 1, path, result) path.pop() # 回溯撤销处理的节点216.组合总和III题目链接216. 组合总和 III - 力扣LeetCode思路这个跟上个题差不多就是收集结果的终止条件需要变一下其他一样对path的长度和总和有要求提交class Solution: def combinationSum3(self, k: int, n: int) - List[List[int]]: res[] self.backtrack(n,k,1,[],res) return res def backtrack(self,n,k,starindex,path,res): if len(path)k and sum(path)n: res.append(path[:]) return for i in range(starindex,10): path.append(i) self.backtrack(n,k,i1,path,res) path.pop()17.电话号码的字母组合题目链接17. 电话号码的字母组合 - 力扣LeetCode思路首先需要找一个字典把数字和字母对应然后回溯但是这里我不会写但凡动一下脑子就会成浆糊class Solution: def letterCombinations(self, digits: str) - List[str]: res[] self.backtrack(digits,[],res,1) return res def backtrack(self,digits,path,res,startindex): dict1{2:abc,3:def,4:ghi,5:jkl,6:mno,7:pqrs,8:tuv,9:wxyz} if len(path)len(digits): res.append(path[:]) return for index in range(len(digits)): for zimu in dict1[digits[index]]: path.append(zimu) self.backtrack(digits,path,res,index1) path.pop()我写的第一版错误代码可以看一下我想遍历每个但是 for index in range(len(digits)):这个应该是用回溯完成的。正确思路1.先建立数字→字母的映射2. 回溯函数的作用backtrack(digits, index, path, res)digits输入的数字串如23index现在正在处理第几个数字path当前已经选好的字母组合比如[a,d]res存放最终结果3. 终止条件出口if len(path) len(digits): res.append(.join(path)) return4. 递归过程for char in self.dict1[digits[index]]: path.append(char) # 选一个字母 backtrack(..., index1) # 处理下一个数字 path.pop() # 撤销选择回溯提交class Solution: def letterCombinations(self, digits: str) - List[str]: if not digits: return [] res[] self.dict1{2:abc,3:def,4:ghi,5:jkl,6:mno,7:pqrs,8:tuv,9:wxyz} self.backtrack(digits,0,[],res) return res def backtrack(self,digits,index,path,res): if len(path)len(digits): res.append(.join(path)) return for char in self.dict1[digits[index]]: path.append(char) self.backtrack(digits,index1,path,res) path.pop()

更多文章