回溯方法的学习和总结
1. 按照博主的划分,回溯问题分为:子集型、组合型、排列型。
2. 子集型的考虑方法分成:从过程分析,选或不选;从答案角度分析,选择哪个。如果有重复的元素,应该如何处理
3. 需要总结剪枝技巧,
2.1 排列型问题
这是计算排列个数的问题,从n个数中选n个数的排列个数,符号表示Ann,1-2-3 和 1-3-2 是不同的排列,n个数的排列个数是n的阶乘。
46. 全排列 从没有重复数字的序列nums[] 中选择数字,查看所有的排列个数。在选取过程中,使用b_flag[] 进行标记,只能选未选取的。
47. 全排列 II 从有重复数字的序列nums[] 中选择数字,查看所有的排列个数。在选取过程中,除了使用b_flag[]进行标记, 还使用如下判断条件:
if (p_flag[ix] || (ix > 0 && !p_flag[ix - 1] && nums[ix] == nums[ix - 1] )) continue;
if (p_flag[ix] || (ix > 0 && !p_flag[ix - 1] && nums[ix] == nums[ix - 1] ))
上述语句中的!p_flag[ix-1] 写成p_flag[ix-1] 也可以得到正确答案,但是效率会下降。因为前者是同层剪枝,对于[1,1,1]只选取一次,就可以得到结果,其他情况直接被剪枝。而后者是不同层剪枝,在尝试所有的排列都失败后,最后一次才获取到正确结果。
2.2 子集型问题
2.3 组合型问题
目前, 分析这种问题,我认为“选哪个”的方法,更好理解。边界条件和剪枝条件更好确认
记录不会的题目:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY