最新要闻
- 报道:效仿微软XGP:Meta为Quest准备订阅制服务
- 每日短讯:健身猪一只最高能卖8万元:看完再也不配说胖得像猪了
- 环球百事通!联想小新Pro 16 2023酷睿独显版预售:7299元起 可选RTX4050
- 环球即时看!年度优秀员工评语简短(年度优秀员工评语)
- 世界动态:京东百亿补贴大杀器亮剑后 尚“无人伤亡”
- 奥斯卡影帝陨落“烂片之王” 凯奇:不愿加入漫威宇宙
- 信阳农专
- 动态:3.8节大促:腾讯视频、QQ、绿钻、B站、百度网盘会员五折起
- 看点:钢琴弹出的声音怎么这么好听啊?离不开这四大件!
- 我国多地将体验超前温暖:郑州要破29℃ 但秋裤还不能脱
- 环球速看:当下最完美全面屏!京东方宣布独家供应努比亚Z50 Ultra
- 丧心病狂!这些人利用AI声音冒充亲人诈骗1100万美元
- 快看点丨8个月宝宝像打冷颤一样头抖_婴儿偶尔腿打颤正常吗
- 被批恶俗烂梗 鸡你太美商标无一注册成功:超20枚被判无效
- 即时看!AMD Yes!FSR 2.2插件已适用于虚幻引擎
- 环球焦点!V12自吸发动机+三电机!兰博基尼旗舰跑车动力信息公布:超千匹
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
【LeetCode回溯算法#01】图解组合问题
组合问题
力扣题目链接(opens new window)
(资料图片仅供参考)
给定两个整数 n 和 k,返回范围 [1, n]
中所有可能的 k 个数的组合。
示例:输入: n = 4, k = 2输出:[[2,4],[3,4],[2,3],[1,2],[1,3],[1,4],]
思路
如果像题目给的例子那样,k是一个较小的值(比如2),那么一个很直接的想法是使用两层for循环去遍历数组即可
vector> res;vector temp;for(int i = 0; i < n; ++i){ for(int j = i; j < n; ++j){ temp.push_back(i); temp.push_back(j); res.push_back(temp); temp.clear(); }}return res;
那如果k要是100呢?写100层for循环?
显然,使用for循环进行暴力遍历的话,遍历的深度是有限的
既然涉及到了深度,那么递归和树结构就很适合来解决此类问题了
首先,递归可以在设置的条件范围内搜索到足够的深度,我们实际上只用在递归的最后一层进行横向遍历(即for循环),其余的则在回溯过程中处理
其次,我们可以将整个搜索过程想象成一个树结构
当我们通过递归到达某个分支的"叶子结点"后,这条路径上保存的节点值就是一个组合的结果
下面贴一下卡哥的图和我经过理解补充的图,可以对比来看方便理解
可以看到,每层递归中都有一个for循环,目的是用于处理本层递归的横向遍历过程
当第一层递归被调用时,其中的for循环会依次处理[1,2,3,4],取1(将1保存)
此时又触发一层递归,第二层递归会依次处理[2,3,4],取2(将2保存)
此时,再次触发递归,到达第三层,在第三层递归中,我们判定用于保存结果的数组(目前为[1,2])的大小已经等于k值
因此,在第三层递归中触发了终止条件,递归结束
回溯,到达第二层递归,此时将结果数组中的2弹出
回溯,到达第一层递归,此时将结果数组中的1弹出
第一层递归中的for继续遍历到下一个数(即2),然后重复上述递归过程
当然,在第二层递归中,每次起始的遍历位置是不同的,后面代码里会解释
代码分析
写递归嘛,那还是遵循递归的步骤,但这里其实可以改叫回溯三部曲了
1、确定递归函数的返回值和参数
本质上我们是使用递归去操作/遍历一个数组,因此不需要返回值
输入参数那肯定是遍历区间n和组合大小k了
经过上面的分析得知,我们还需要一个数组来保存每层递归取到的结果
这里将该数组命名为path,其记录的是我们从第一层递归到最里层递归这条路径上遇到并保存的值
还需要一个数组res来保存所有的path
并且,在第二层递归中,为了防止组合中出现重复值([1,2]和[2,1]被视为相同结果),我们需要不断调整遍历的范围
因此输入参数中还需要一个变量给出遍历的起始位置
class Solution {public: //定义数组 vector path; vector> res;//保存最终结果 void backtracking(int n, int k, int beginIndex){ } vector> combine(int n, int k) { }};
2、确定终止条件
还是通过前面的讨论得知,当我们到达最里层递归时,需要终止。即到达我们想象的二叉树结果的叶子节点
如何判断"到达叶子节点"这件事呢?
其实可以通过路径数组path的大小来判断,如果path的大小等于k,说明递归的深度已经到头了,此时应该结束递归
class Solution {public: //定义数组 vector path; vector> res;//保存最终结果 void backtracking(int n, int k, int beginIndex){ //确定终止条件 if(path.size() == k){ //保存path到resres.push_back(path); return;//结束递归 } } vector> combine(int n, int k) { }};
3、确定单层处理逻辑
这一部分需要去规定在本层递归中应该如何遍历数组
还是结合前面的分析:我们在一层递归中实际需要做的是使用for对当前以beginIndex为起始,以n为结束(即[beginIndex, n])的数组进行遍历
那就写for循环呗
class Solution {public: //定义数组 vector path; vector> res;//保存最终结果 void backtracking(int n, int k, int beginIndex){ //确定终止条件 if(path.size() == k){ //保存path到resres.push_back(path); return;//结束递归 } //确定单层处理逻辑 //遍历本层递归的数组,范围是[beginIndex, n] for(int i = beginIndex; i < n; ++i){ //添加当前路径节点值到path path.push_back(i); //进入下一层递归 backtracking(int n, int k, i + 1);//跳过当前值 //编写回溯处理逻辑 //回溯时删掉当前层保存的值 path.pop_back(); } } vector> combine(int n, int k) { }};
打完收工
完整代码
在主函数中,把backtracking调用并给出beginIndex的初值即可
class Solution {public: //定义数组 vector path; vector> res;//保存最终结果 void backtracking(int n, int k, int beginIndex){ //确定终止条件 if(path.size() == k){ //保存path到resres.push_back(path); return;//结束递归 } //确定单层处理逻辑 //遍历本层递归的数组,范围是[beginIndex, n] for(int i = beginIndex; i <= n; ++i){ //添加当前路径节点值到path path.push_back(i); //进入下一层递归 backtracking(n, k, i + 1);//跳过当前值 //编写回溯处理逻辑 //回溯时删掉当前层保存的值 path.pop_back(); } } vector> combine(int n, int k) {//可以先清一下两个结果数组 //res.clear(); //path.clear(); backtracking(n, k, 1);//调用递归去操作数组 return res; }};
注意点
遍历本层递归时,i是要 小于等于n的,并且beginIndex的初始值应该是1
这里需要厘清一个关系
本题中并不是真的有一个数组等着我们去遍历(分析时写[1,2,3,4]也只是便于理解),只是给定的一个范围,在该范围中找出所有两个元素的组合
因此要在[1,4]范围中找出所有两个元素的组合,就真的要从1开始,并且也要包含4
(不要错误的认为从1开始就漏了[1,2,3,4]中的1,结束位置是4就超出数组范围。因为根本就没有数组)
剪枝优化
TBD
关键词:
【LeetCode回溯算法#01】图解组合问题
报道:效仿微软XGP:Meta为Quest准备订阅制服务
每日短讯:健身猪一只最高能卖8万元:看完再也不配说胖得像猪了
环球百事通!联想小新Pro 16 2023酷睿独显版预售:7299元起 可选RTX4050
环球即时看!年度优秀员工评语简短(年度优秀员工评语)
[NOIP2017 普及组] 棋盘
AspNet Core MVC项目接入AdminLTE
世界动态:京东百亿补贴大杀器亮剑后 尚“无人伤亡”
奥斯卡影帝陨落“烂片之王” 凯奇:不愿加入漫威宇宙
信阳农专
精准管控|AIRIOT数字油库智能化解决方案
今日热门!k8s对外服务之Ingress
开发中用到的配置文本文件
当前通讯!Python定制对象的独有特征
动态:3.8节大促:腾讯视频、QQ、绿钻、B站、百度网盘会员五折起
看点:钢琴弹出的声音怎么这么好听啊?离不开这四大件!
我国多地将体验超前温暖:郑州要破29℃ 但秋裤还不能脱
环球速看:当下最完美全面屏!京东方宣布独家供应努比亚Z50 Ultra
丧心病狂!这些人利用AI声音冒充亲人诈骗1100万美元
5步绘制高质量流程图
世界消息!朴素贝叶斯与Laplace平滑
一篇搞懂cookie和session
【环球速看料】生成你的自定义密码本Python
快看点丨8个月宝宝像打冷颤一样头抖_婴儿偶尔腿打颤正常吗
被批恶俗烂梗 鸡你太美商标无一注册成功:超20枚被判无效
即时看!AMD Yes!FSR 2.2插件已适用于虚幻引擎
环球焦点!V12自吸发动机+三电机!兰博基尼旗舰跑车动力信息公布:超千匹
天天即时看!招不到人!新加坡软件工程师月薪基本都超4.6万 跑不赢房租
微动态丨今晚打老虎!周杰伦用《赌侠2》梗回应周星驰喊话
当前快播:记一次影视cms黑盒CSRF->RCE
OpenYurt 在龙源 CNStack 云边协同项目的应用
当前资讯!注解:@RequiredArgsConstructor、 @Validated、 @Valid、 @Lazy
全球微动态丨MP 代码生成器工具类
焦点消息!2999元起!五菱羚羊智能电动自行车发布:新国标 200km续航
天猫超级红包开抢:今晚抢30万个6.8元天猫红包 最高3888元
观速讯丨育碧“壮士断腕”:将对欧洲工作室实施战略重组
天天热资讯!人民网评论:别让恶俗网络烂梗毒害孩子 散发恶臭气息
观速讯丨Win11强制要求的金身告破 TPM 2.0漏洞影响数十亿设备
天天头条:60% 程序员大呼:我要远程办公!
世界热消息:一篇文章带你了解折线图
焦点短讯!创建型-单例模式
世界要闻:18位身份证校验Python
【世界热闻】百度统计快速实现网站访问量的统计
环球速递!任长霞电视剧剧情
世界要闻:「全国两会跨省联动报道」一生·一世·一群鸟——黑颈鹤与贵州保护者刘广惠的故事
16+512GB杀到2799元 一加Ace 2V颠覆友商:便宜1000多
观热点:摄影小白也能瞬间变大师!努比亚Z50 Ultra视频评测:最完美的无孔全面屏
当前快报:杭州亚运倒计时200天!首批亚运电竞特许商品上线:史上首次
当前报道:首发749元 一加Buds Pro 2轻享版发布:丹拿联合调音
即时焦点:蔚来丹麦首座换电站上线:老外“跪”在地上观看
Linux常用的20个命令(上)
天天速递!全景剖析阿里云容器网络数据链路(六):ASM Istio
全球聚焦:gitee突然无法访问
【天天时快讯】自从用了 Stream,代码更简洁优雅了!
每日观察!拍了10多年星星!努比亚Z50 Ultra升级11大星空算法
今日看点:AI免费设计LOGO效果惊艳 雷军200万花早了
1.6L自吸最大功率99kW 2023款日产轩逸本月上市
焦点日报:一加Ace 2V首发主动增强式超级Wi-Fi:穿墙能力提升30%
全球快报:一加Ace 2V触控体验碾压iPhone 14 Pro Max:在安卓阵营中表现最佳
全球微动态丨为什么99%的程序员都做不好SQL优化?
当前通讯!跟老杜从零入门MyBatis到架构思维(一)MyBatis概述
告别数据开发中的人工审核!火山引擎 DataLeap 落地“自动校验开发规范”能力
每日播报!Markdown语法学习
赞美翡翠的优美句子有哪些?
【世界速看料】“APP刺客”倒逼厂商升级大内存、大存储!8+128根本不够用了
天天微速讯:一人改代码搞崩推特 马斯克气疯:全部重写!
天天观察:出演《狂飙》爆红!雷军晒“大嫂”高叶人像照:小米13徕卡镜头
全球短讯!若依项目部署详解
最新:python奇葩反爬-你是故意的还是不小心的
全球观焦点:(数据库系统概论|王珊)第十章数据库恢复技术-第四、五、六、七节:数据库恢复技术和数据库镜像
全球百事通!以图搜图实现
每日播报!四步教会你如何画好流程图?
每日快播:华昌集团
全球聚焦:你几点睡?全国熬夜最狠城市揭晓:广东最牛 干这些行业的熬夜最多
金俊秀为什么叫细亚俊秀?金俊秀个人简介资料
已考上大学的简短四字祝福语有哪些?祝福前途似锦的古诗词有哪些?
强迫性动作属抑郁症吗?强迫性动作的自我疗法有哪些?
天天热点评!嫌弃之余,百度的这些搜索技巧真得会!
环球热议:EF7数据库提供者的自定义值生成器
全球热议:Use CMake notes
ArrayList和LinkedList的区别
咬甲癖是心理疾病吗?咬甲癖怎么治疗?
皮肤剥离强迫症是什么?皮肤剥离强迫症怎么治疗?
中移动董事长喊话中小学必学编程:还有委员喊话取消英语主科学了没用 你支持谁?
【世界快播报】最受欢迎的豪华中大型SUV 新款宝马X5实车亮相:国产必卖爆
湖北省“最强9万元补贴”蔓延 云南东风本田抄作业:直补6万
热点在线丨比Dev渠道更“快”!微软为Windows新增Canary测试渠道
全球观热点:砸130亿元 日本又失败!新主力火箭发射后自毁 日本专家谈落后中国多少年
焦点!【ES三周年】Elasticsearch安全配置详解
时讯:【MRTK】修改 HoloLens 应用的默认系统设置
新动态:开心档之Python3 面向对象
面试官要你介绍项目,怎么说?
每日速读!git的使用(一篇非常好的文章)
【快播报】老杜带你从零入门MyBatis,学MyBatis看这篇就够了!
bt种子是什么意思?bt种子怎么变成文件?
怎么查询手机号的号主姓名?怎么查询手机号用了多少年?
cpu怎么看性能参数?cpu检测软件哪个好?
车主称极氪001空调喷白粉末 官方回应:符合国标没有损害
世界今热点:育碧参与 巴黎圣母院加速修复:力争明年重新开放
世界速看:为什么小米手机不在美国卖?看完原因对雷军更有好感