【递归、搜索与回溯】综合练习二

综合练习二

  • 1.组合
  • 2.目标和
  • 3.组合总和
  • 4.字母大小写全排列

在这里插入图片描述

点赞👍👍收藏🌟🌟关注💖💖
你的支持是对我最大的鼓励,我们一起努力吧!😃😃

1.组合

题目链接:77. 组合

题目分析:

在这里插入图片描述
注意这道题结果是不能重复的。如1,2 和 2,1 虽然位置不同但是是同样的组合。
在这里插入图片描述

算法原理:
这样的题我们还是画出决策树,然后根据这棵树把所有细节分析清楚

在这里插入图片描述
每个位置都有4种选择,首先前面被选种的数字后面就不能再选了,如1,2 和2,1只是位置不同数都是一样的,因此还是重复。其次上每一层都是从上一层被选数字的后面一个开始选的。全局变量,一个ret记录最终结果,一个path记录每条路径的结果。递归函数,给一个pos,每一层都从pos位置开始往后选,dfs(pos)回溯 当递归结束往上返回要恢复现场pop掉path最后一个位置元素,剪枝 用pos控制开始的位置就是剪枝,递归出口 当path.size() == k 就可以把path放到ret里,然后结束本次递归。

在这里插入图片描述

class Solution {vector<vector<int>> ret;vector<int> path;int n_,k_;
public:vector<vector<int>> combine(int n, int k) {n_=n;k_=k;dfs(1);return ret;}void dfs(int pos){if(path.size() == k_){ret.push_back(path);return;}for(int i=pos;i<=n_;++i){path.push_back(i);dfs(i+1);path.pop_back();//恢复现场}}
};

2.目标和

题目链接:494. 目标和

题目分析:

在这里插入图片描述

给一个数组,对数组每个数字前面添加 + 或者 - ,串联所有数字构成一个表达式,找出表达式和为目标值有多少种情况。

算法原理:
如果前面做过选子集的问题,这道题思想是一模一样的,找子集其中有一张方法是 这个数字 选or不选,这道题就是 这个数字前面 +or-。我们就根据这个画出决策树。
这里的步骤都不说了,和子集哪里的一模一样。最后到叶子节点这条路径的和加起来等于target,就是一种情况。

在这里插入图片描述
这里写代码有两种形式。

  1. path 是全局变量的时候的代码
  2. path 作为参数的代码

可以参考求二叉树所有路径那道题,这道题也是path作为全局变量和作为参数两种不同形式的代码。

path作为全局变量, 需要考虑回溯恢复现场。
path作为参数,不用考虑,因为在递归在向上返回的时候就已经帮助我们回溯恢复现场了。 path作为参数也是有回溯的不过是编译器就可以帮我回溯了。

如果path是一个单独的类型的话,如int类型,你会发现把它放在dfs参数里面写的话,代码比较简洁。如果path是一个数组类型的话,推荐使用全局变量

path作为全局变量的代码

class Solution {int ret,path,_target;
public:int findTargetSumWays(vector<int>& nums, int target) {_target=target;dfs(nums,0);return ret;}void dfs(vector<int>& nums,int pos){if(pos == nums.size()){if(path == _target) ++ret;return;}// 加法path+=nums[pos];dfs(nums,pos+1);path-=nums[pos];// 减法path-=nums[pos];dfs(nums,pos+1);path+=nums[pos];}
};

path作为参数的代码

class Solution {int ret,_target;
public:int findTargetSumWays(vector<int>& nums, int target) {_target=target;dfs(nums,0,0);return ret;}void dfs(vector<int>& nums,int pos,long path){if(pos == nums.size()){if(path == _target) ++ret;return;}// +dfs(nums,pos+1,path+nums[pos]);// -dfs(nums,pos+1,path-nums[pos]);}
};

3.组合总和

题目链接:39. 组合总和

题目分析:
在这里插入图片描述

注意这个数组中的数字,可以无限制重复被选择。但是结果不能有重复的就如下面2,2,3 和 2,3,2是属于同一种组合,只是位置不同罢了。

在这里插入图片描述
算法原理:
暴力枚举所有情况,根据不同的决策树,我们可以写出不同的代码。就比如

  1. 根据每个位置选什么的策略 画决策树
  2. 根据每个数选or不选 画决策树
  3. 考虑每个数用多少个 画决策树

解法一: 根据每个位置选什么的策略 画决策树

每个位置都有三种选择,因为一个数可以被无限制重复选择,所以递归到下一层还可以选。注意3,2 和 2,3 是一样的组合,前面选了后面就不要在选了。并且5,2 和5,3 和2,5 和3,5一样前面选了后面就不要选了。这是一种剪枝情况,还有当一路径的和sum都大于target了就可以结束递归了。这也是一种剪枝情况。

前面我们特别说明一下全局变量的和作为参数的在递归的区别。这里sum求每一条路径的和我们把它作为参数在递归函数中传递,这样每次回溯就不管sum了,而ret和path还是作为全局变量递归函数 我们发现每次都是从本身位置开始往下选,因此 dfs(nums,pos,sum),回溯 sum不用管,path等到递归返回后pop掉最后一个元素,剪枝已经在递归函数中作为pos传递了 ,递归出口 当sum == target 将path放到ret里然后返回,还有一种情况当sum>target不需要往下递归了和pos == nums.size()也不需要往下递归直接返回;
在这里插入图片描述

class Solution {vector<vector<int>> ret;vector<int> path;int aim;
public:vector<vector<int>> combinationSum(vector<int>& candidates, int target) {aim=target;dfs(candidates,0,0);return ret;}void dfs(vector<int>& candidates,int pos,int sum){if(sum >= aim){if(sum > aim) return;if(sum == aim) ret.push_back(path);return;}for(int i=pos;i<candidates.size();++i){path.push_back(candidates[i]);dfs(candidates,i,sum+candidates[i]);path.pop_back();//恢复现场}}
};

解法二: 考虑每个数用多少个 画决策树

每个数可以被选择0-n次,当被选择n次的和都大于target就不能选选了,也就是说小于或者等于target的时候可以一直选这个数,然后往下递归也是和上面情况一样。这里有个细节要注意,当递归回去的时候,不要直接把path最后一个位置pop掉,而是等到这个数所有情况都选完了然后在pop掉path最后一个元素,因为这个数可以选1次、两次等等,如果选择一次往下走递归回来了你pop掉了,下一次path.push_back()就要放两个这个数,因为我们不先pop,等到最后这个数所有情况搞完返回上一层我们在把前面加入的所有这个数pop掉。

在这里插入图片描述

class Solution {vector<vector<int>> ret;vector<int> path;int aim;
public:vector<vector<int>> combinationSum(vector<int>& candidates, int target) {aim=target;dfs(candidates,0,0);return ret;}void dfs(vector<int>& candidates,int pos,int sum){if(sum == aim){ret.push_back(path);return;}if(sum > aim || pos == candidates.size()) return;// 枚举个数for(int k = 0; k * candidates[pos] + sum <= aim; k++){if(k) path.push_back(candidates[pos]);dfs(candidates, pos + 1, sum + k * candidates[pos]);}// 恢复现场for(int k=1;k*candidates[pos]+sum <= aim;++k){path.pop_back();}}
};

4.字母大小写全排列

题目链接:784. 字母大小写全排列

题目描述:

在这里插入图片描述
算法原理:

还是画出决策树,写代码。
对于每个字母我们都有两种选择,要么不变,要么变,小写变大写,大写变小写。对于数字我们不管它。其他的还是和前面的题一模一样。可以用全局path,也可以path当参数用。

在这里插入图片描述

class Solution {vector<string> ret;string path;
public:vector<string> letterCasePermutation(string s) {dfs(s,0);return ret;}void dfs(string& s,int pos){if(pos == s.size()){ret.push_back(path);return;}char ch=s[pos];// 不改变path.push_back(ch);dfs(s,pos+1);path.pop_back();// 变if(ch < '0' || ch > '9'){if(islower(ch)) ch-=32;else ch+=32;path.push_back(ch);dfs(s,pos+1);path.pop_back();}}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/28719.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ实践——定制一致性Hash交换器的路由字段

大纲 Property法定制交换器绑定队列测试 Header法定制交换器绑定队列测试 参考资料 在《RabbitMQ实践——利用一致性Hash交换器做负载均衡》一文中&#xff0c;我们熟悉了一致性Hash交换器的使用方法。默认的&#xff0c;它使用Routing key来做Hash的判断源。但是有些时候&…

Maven 快速入门

Maven 简介 Maven是apache旗下的一个开源项目&#xff0c;是一款用于管理和构建java项目的工具。 依赖管理 方便快捷的管理项目的依赖资源(jar包),避免版本冲突 配置 依赖: 指当前项目运行所需要的(jar包) 在pom.xml 中编写<dependencies> 标签 在<dependencies…

线程池监控是怎么做的?

引言&#xff1a;在现代软件开发中&#xff0c;线程池是一种重要的并发控制机制&#xff0c;它能有效管理和复用线程资源&#xff0c;提升系统的性能和响应速度。然而&#xff0c;随着应用规模的扩大和复杂性的增加&#xff0c;对线程池进行有效监控显得尤为重要。线程池监控不…

bellman-ford——AcWing 853. 有边数限制的最短路99

bellman-ford 定义 贝尔曼-福特&#xff08;Bellman-Ford&#xff09;算法是一种用于在加权有向图中计算单源最短路径的算法。 运用情况 可以处理存在负权边的图。常用于找出图中从一个特定顶点到其他所有顶点的最短路径。 注意事项 时间复杂度相对较高。如果图中包含从源…

计算机毕业设计Django+Vue.js考研推荐系统 考研分数线预测 中公考研爬虫 混合神经网络推荐算法 考研可视化 机器学习 深度学习 大数据毕业设计

Python数据分析与可视化期末项目报告 项目名称&#xff1a; 考研推荐系统数据分析与可视化 学 号&#xff1a; 姓 名&#xff1a; …

【PHP开发工程师系统性教学】——thinkPHP的分页操作,不管有几页,用这个你想分几页就分几页

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

MoneyPrinterPlus:AI自动短视频生成工具,详细使用教程

MoneyPrinterPlus是一款使用AI大模型技术,一键批量生成各类短视频,自动批量混剪短视频,自动把视频发布到抖音,快手,小红书,视频号上的轻松赚钱工具。 之前有出过一期基本的介绍&#xff0c;但是后台收到有些小伙伴说&#xff0c;不知道如何使用。 今天我将会手把手的详细介绍…

怎么加密U盘数据?U盘加密软件哪个好?

U盘是我们在生活和工作中最常用的移动存储设备&#xff0c;而为了避免U盘数据泄露&#xff0c;我们需要使用U盘加密软件来加密保护U盘数据。那么&#xff0c;U盘加密软件哪个好呢&#xff1f;下面我们就一起来了解一下吧。 BitLocker加密 BitLocker是Windows系统提供的磁盘加密…

多种传感器在钢铁工业安全风险监测预警中的应用

中国作为钢铁行业的生产与消费大国&#xff0c;其钢铁冶炼流程的复杂性和长周期性使得各环节中频繁出现的有毒有害、易燃易爆气体以及粉尘等危险物质成为行业安全管理的重大挑战。为了保障工作人员的安全&#xff0c;多种传感器在安全风险监测预警中的应用显得尤为重要。 钢铁产…

java从红外图片提取温度,计算超过阈值的温度占总面积的百分比

灰度图是单通道图&#xff0c;像素只有一个值&#xff1a;灰度值。灰度值越高&#xff0c;则图像越亮。 现在我们已经知道我们看到一张灰度图是由许多不同灰度值的像素点构成&#xff0c;而每个像素就是一个越亮的像素&#xff0c;灰度值越高&#xff0c;最高值是255&#xff…

Latex的参考文献中显示三个问号???——解决办法

1、问题描述 在使用spring模板&#xff0c;并引用book时&#xff0c;末尾的引文地方出现三个???由于使用的bibtex是直接从谷歌学术中导出来的&#xff0c;其中仅包含作者&#xff0c;书名&#xff0c;出版社&#xff0c;年份等&#xff0c;缺少了重要的信息。结果导致在出版…

什么!没有Starter的阿里云OSS也能集成到SpringBoot?

实际上&#xff0c;我们在Maven存储库中尝试搜索阿里云OSS。在此过程中&#xff0c;我们会发现阿里云官方未提供一种集成Spring Boot的模式&#xff0c;即xxx-Springboot-Starter&#xff0c;显然&#xff0c;这是一个需要自行定制的组件。然而&#xff0c;如今许多企业在研发过…

LeetCode | 520.检测大写字母

这道题直接分3种情况讨论&#xff1a;1、全部都为大写&#xff1b;2、全部都为小写&#xff1b;3、首字母大写其余小写。这里我借用了一个全是大写字母的串和一个全为小写字母的串进行比较 class Solution(object):def detectCapitalUse(self, word):""":type …

【机器学习】计算机图形和深度学习模型NeRF详解(1)

1.引言 1.1.1. NeRF研究的背景 人们在拍照的时候&#xff0c;往往会中各个角度进行拍摄&#xff0c;以呈现出物体的全貌和美丽。下图的照片&#xff0c;拍摄的是一架楼梯&#xff0c;但是拍摄的角度完全不同&#xff1a; 我们可以看到这些图片都是楼梯的照片&#xff0c;但拍…

Training language models to follow instructions with human feedback 论文阅读

论文原文&#xff1a;https://arxiv.org/pdf/2203.02155 论文简介 语言模型越大并不意味着它能更好的理解用户的意图&#xff0c;因此在这篇论文中&#xff0c;展示了根据人的反馈对模型进行微调&#xff0c;使得语言模型能够在各种人物上更好的理解用户的意图。在评估中&…

树莓派4B学习笔记11:PC端网线SSH连接树莓派

今日继续学习树莓派4B 4G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 版本是4.5.1&#xff1a; 今日学习使用网线连接树莓派&#xff0c;网线可以提供更…

使用 C# 学习面向对象编程:第 8 部分

抽象方法 亲爱的读者&#xff0c;本文是 OOP 的第四大支柱&#xff0c;也是最后一大支柱。对于 OOP 初学者来说&#xff0c;这很容易让人困惑。因此&#xff0c;我们用非常简单的语言提供了一个示例。 “抽象用于管理复杂性。无法创建抽象类的对象。抽象类用于继承。” 例如…

降噪领夹麦克风哪个牌子好?揭秘无线领夹麦克风哪个降噪好

相信很多新手视频创作者都有一个疑问&#xff1a;为什么别人的视频或者直播音质这么清晰&#xff0c;几乎没什么噪音呢&#xff1f;其实最主要的就是麦克风的原因&#xff0c;相机或手机内置的麦克风是无法提供高质量的音频记录以及很好的指向性的。 想要拍摄出来的视频作品拥有…

每一个男人都曾有一个机器人的梦想

每一个男人都曾有一个机器人的梦想 我也有 每一个男人都曾有一个机器人的梦想。对于我来说&#xff0c;这个梦想始于童年时代&#xff0c;那时变形金刚风靡一时&#xff0c;几乎所有80后的孩子都为之疯狂。我是80后中的一员&#xff0c;那时候的科技还远没有如今这般发达&#…

《现代通信原理与技术》码间串扰和​​​​​​​无码间串扰的眼图对比实验报告

实 验&#xff1a;码间串扰和无码间串扰的眼图对比实验报告 摘 要&#xff1a; 在数字通信系统中&#xff0c;码间串扰&#xff08;Inter-Symbol Interference, ISI&#xff09;是影响信号质量和系统性能的重要因素之一。本实验通过MATLAB软件生成并对比了受码间串扰影响和未…