当前位置: 首页 > news >正文

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,i+1,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,index+1) path.pop()

我写的第一版错误代码,可以看一下,我想遍历每个,但是 for index in range(len(digits)):这个应该是用回溯完成的。

正确思路

1.先建立数字→字母的映射

2. 回溯函数的作用

backtrack(digits, index, path, res)

  • digits:输入的数字串,如"23"

  • index现在正在处理第几个数字

  • path当前已经选好的字母组合(比如['a','d']

  • res:存放最终结果

3. 终止条件(出口)

if len(path) == len(digits): res.append(''.join(path)) return

4. 递归过程

for char in self.dict1[digits[index]]: path.append(char) # 选一个字母 backtrack(..., index+1) # 处理下一个数字 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,index+1,path,res) path.pop()
http://www.jsqmd.com/news/614701/

相关文章:

  • 兰亭妙微UI设计趋势白皮书:2025移动端视觉风格、功能设计与体验优化的完整落地指南 - ui设计公司兰亭妙微
  • 2025年同等学力离散数学与组合数学---三、填空题:
  • 前端开发者必学AI:GitHub热门营销项目推荐(营销|增长|广告方向)
  • chrony命令实验
  • 阴阳师智能自动化脚本:安全防护与效率提升全指南
  • 数智赋能,破局前行——当前医美行业困局与高效运营之道
  • Provider的介绍和引入,deepseek的接入实现
  • 校招简历-技术岗简历最怕的,不是没项目,是写成“报菜名”
  • 浅谈函数接口ata_dev_read_id
  • 三轴码垛仿真算是工控入门的经典项目了。这次用FactoryIO搭建的立体仓库场景,配合博图V16编写PLC程序,咱们直接动手实操
  • Weibull案例8-如何给客户一个合理的产品可靠性指标
  • 紧急!GraalVM上线后OOM频发?立即执行这5个内存安全检查项——覆盖Quarkus/Spring Native主流框架
  • 你的终端神器之Oh My Zsh度
  • QTableWidget 表格组件耙
  • 优秀的一次性手套食品级工厂哪家有保障 - 品牌企业推荐师(官方)
  • 力士乐变频器调试软件RDwin11V09 英文版
  • 必冲!近百万激励金池!第八届CCF开源创新大赛赛题等你来战!
  • 基于深度学习opencv的一体化模型图像去雨+图像去噪+图像去模糊(图像处理-图像复原-代码+部署运行教程)
  • .NET 的 GC 是‘自动内存管理’,为什么还要关注对象生命周期?一个对象明明不再用了,但不被回收,可能卡在哪儿?
  • 【书生·浦语】internlm2-chat-1.8b部署教程:支持WASI兼容沙箱安全运行
  • 相同文件按优先级取唯一值
  • 清明出游带火“吃喝玩乐”齐增长 美团旅行:南京、成都、北京为热门出游目的地
  • 2026精油灌装机高性价比品牌评选TOP6
  • AScript - C#轻量级动态脚本引擎
  • AI Weekly | 2026年4月第二周 · GitHub热门项目与AI发展趋势深度解析
  • 收藏!Agent开发高频面试题深度解析,小白也能轻松入门大模型应用
  • 【EF Core 10向量搜索架构设计终极指南】:20年微软数据平台架构师亲授生产级向量检索系统落地的5大避坑原则
  • django基于Spark的南昌房价数据分析系统的设计与实现_45i0b357_c018
  • (27)ArcGIS Pro 范围内汇总、汇总统计数据与交集制表:空间统计三工具全攻略
  • 谷歌Gemma 4 MoE实测