递归算法学习——目标和,组合总和,字母大小写全排列

news2024/11/29 6:28:18

目录

一,目标和

1.题意

2.例子

3.题目接口

4.解题思路及代码

 二,组合总和

1.题意

2.例子

3.题目接口

4.解题思路及代码

三,字母大小写全排列

1.题意

2.例子

3.题目接口

4.解题思路及代码


一,目标和

1.题意

给你一个非负整数数组 nums 和一个整数 target 。

向数组中的每个整数前添加 '+' 或 '-' ,然后串联起所有整数,可以构造一个 表达式 :

例如,nums = [2, 1] ,可以在 2 之前添加 '+' ,在 1 之前添加 '-' ,然后串联起来得到表达式 "+2-1" 。

返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目

2.例子

 

3.题目接口

class Solution {
public:
    int findTargetSumWays(vector<int>& nums, int target) {

    }
};

4.解题思路及代码

举个例子:如果我的数组里面有三个1,我要得到运算结果为1的组合。我们该如何操作呢?画出决策树如下:

从这张图里面我们可以看到,这里只要深度优先搜索就行了。那什么时候回退到上一层呢?答案显而易见,只有走到最后一层才能回退。函数体应该怎么写呢?关注节点,可知道我们在一个节点上有两种选择。别的不说先写代码如下:

class Solution {
public:
    int count;//记录符合条件的情况
    int path;//记录路径上的和

    int findTargetSumWays(vector<int>& nums, int target) {
        dfs(nums,target,0);
        return count;
    }

    void dfs(vector<int>& nums, int target,int pos)
    {
        if(pos == nums.size())
        {
            if(path == target)
            {
                count++;
            }
            return;
        }
        
        path+=nums[pos];//加的情况
        dfs(nums,target,pos+1);
        path-=nums[pos];

        path-=nums[pos];//减的情况
        dfs(nums,target,pos+1);
        path+=nums[pos];

    }
};

这是一个采用了全局变量的写法,但是你会发现这玩意过不了:

所以,我们就得改变一下策略了。这个时候我们就不能用全局变量了,而是改用参数变量,代码如下:

class Solution {
public:
    int count;//记录符合条件的情况

    int findTargetSumWays(vector<int>& nums, int target) {
        dfs(nums,target,0,0);
        return count;
    }

    void dfs(vector<int>& nums, int target,int pos,int path)
    {
        if(pos == nums.size())
        {
            if(path == target)
            {
                count++;
            }
            return;
        }
        
       
        dfs(nums,target,pos+1,path+nums[pos]);//加的情况
       
      
        dfs(nums,target,pos+1,path-nums[pos]);//减的情况
       
    }
};

这样代码就过掉了:

为什么将path变成函数参数后便能过呢?其实原因就是将path改为dfs的参数以后就能够减少+,-的运算了。加减运算在运行时可是很耗时间的。

 二,组合总和

1.题意

给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。

candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。 

对于给定的输入,保证和为 target 的不同组合数少于 150 个。

2.例子

3.题目接口

class Solution {
public:
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        
    }
};

4.解题思路及代码

其实这道题和前面我们见过的那道全排列的题的思路差不多。但是,不同点在于:

1.在这道题里面我们每一组的个数是不定的,只要找出的数组值的和可以等于目标值。

2.在这道题里的同一条路径里的同一个数可以重复使用,但是在一条路劲里使用了以后另一条路劲就不能再使用了。

在这里再来说一下递归的结束条件,当加到的和大于或者等于target的时候便可以收网返回了。所以写出的代码如下:

class Solution {
public:
    vector<int>path;
    vector<vector<int>>ret;
    int aim;//来一个aim来作target的全局变量
    int sum;//计算路径上的数值的和

    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        aim = target;//给aim赋值
       dfs(candidates,0);
       return ret;
    }

    void dfs(vector<int>&candidates,int pos)
    {
        if(sum==aim)
        {
           ret.push_back(path);
           return;
        }

        if(sum>aim)
        {
            return;
        }


        for(int i = pos;i<candidates.size();i++)//当同一层有多个树要遍历时便可以使用for循环
        {
            sum+=candidates[i];
            path.push_back(candidates[i]);
            dfs(candidates,i);//下一层还是从当前位置开始遍历
            sum-=candidates[i];
            path.pop_back();

        }
    }
};

三,字母大小写全排列

1.题意

给定一个字符串 s ,通过将字符串 s 中的每个字母转变大小写,我们可以获得一个新的字符串。返回 所有可能得到的字符串集合 。以 任意顺序 返回输出。

2.例子

3.题目接口

class Solution {
public:
    vector<string> letterCasePermutation(string s) {

    }
};

4.解题思路及代码

首先举个例子,比如s = "a1b2"。先画出决策树如下:

首先,从这个决策树里面可以判断的是我们不会遇到一层要把所有的树遍历一遍的情况。但是在遇到字母时又要考虑两种情况也就是会遇到大小写字母转换的问题。我们的递归结束条件就是当我们每一个path里的节点个数等于原数组时便要结束条件返回到上一层。根据这个思想写出的代码如下:

class Solution {
public:
   string path;//记录路径节点
   vector<string>ret;//记录每一条路径

    vector<string> letterCasePermutation(string s) {
        dfs(s,0);
        return ret;
    }

    void dfs(string& s,int pos)
    {
        if(path.size()==s.size())
        {
            ret.push_back(path);
            return;
        }

        //不变的情况
        char ch = s[pos];//记录一下,因为元素会在后面被删除掉
        path.push_back(s[pos]);
        dfs(s,pos+1);
        path.pop_back();


        //变的情况
        if(ch>'9'||ch<'0')
        {
            char tmp = change(ch);
            path.push_back(tmp);
            dfs(s,pos+1);
            path.pop_back();
        }
       
    }

    char change(char& ch)//大小写转换函数
    {
        if(ch>='a'&&ch<='z')
        {
            ch = ch-32;
        }

        else
        {
            ch = ch+32;
        }

        return ch;
    }
};

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

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

相关文章

jsp 新能源汽车论坛网Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 新能源汽车论坛网是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0…

Android逆向学习(二)vscode进行双开与图标修改

Android逆向学习&#xff08;二&#xff09;vscode进行双开与图标修改 写在前面 这其实应该还是吾爱的第一个作业&#xff0c;但是写完上一个博客的时候已经比较晚了&#xff0c;如果继续敲机械键盘吵到室友&#xff0c;我怕我看不到明天的太阳&#xff0c;所以我决定分成两篇…

英国一大学宣布:严禁使用AI生成个人陈述

8月29日&#xff0c;伦敦都会大学&#xff08;London Met Uni&#xff09;在发给合作伙伴的邮件中表示&#xff1a;“我们知道人工智能技术已经被用来生成个人陈述&#xff08;personal statements&#xff0c;即文书&#xff09;。请注意&#xff0c;本大学不接受任何由人工智…

网络实验 VlAN 中 Trunk Access端口的说明及实验

网络实验 VlAN 中 Trunk Access端口的说明及实验 VlAN 虚拟局域网技术Access端口 工作原理Trunk端口 工作原理简单实验&#xff08;一&#xff09;划分不同Vlan&#xff0c;实现vlan内部通信拓朴图主机IP 配置划分Vlanping 测试 &#xff08;二&#xff09;跨交换机实现VLAN间通…

mate60 里的2035 到底是什么鬼?

华为在 lengbulangqiang 的情况下发布了 mate60 手机&#xff0c;犹如一颗核弹升到了各国的上空&#xff0c;每个人都很想知道这其中发生了什么事情&#xff0c;也是疑点重重&#xff0c;这其中的一些疑点&#xff0c;足以让某些人暴跳如雷。 这 2035 标识到底是什么&#xff1…

李宏毅机器学习笔记:RNN循环神经网络

RNN 一、RNN1、场景引入2、如何将一个单词表示成一个向量3种典型的RNN网络结构 二、LSTMLSTM和普通NN、RNN区别 三、 LSTM的训练 一、RNN 1、场景引入 例如情景补充的情况&#xff0c;根据词汇预测该词汇所属的类别。这个时候的Taipi则属于目的地。但是&#xff0c;在订票系统…

CSS流光按钮-圆形

主要思路 仅保留一条边框 border-radius 50%drop-shadow动画 animation keyframes 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, …

QT串口助手:识别串口号,发送,接收,十六进制

1 摘要 本文主要讲述如何使用QT从零开始实现一个串口助手的基本功能&#xff0c;功能如标题所示&#xff0c;文末附有源码供大家参考。文中若有纰漏&#xff0c;烦请读者斧正。 2 环境 QT 5.14.1Window 11 3 功能 串口打开/关闭 启动软件时识别串口号打开按键随串口打开状…

【python】可视化

柱状图 matplotlib之pyplot模块之柱状图&#xff08;bar()&#xff1a;基础参数、外观参数&#xff09;_plt.bar_mighty13的博客-CSDN博客 bar()的基础参数如下&#xff1a; x&#xff1a;柱子在x轴上的坐标。浮点数或类数组结构。注意x可以为字符串数组&#xff01; height&…

【MySQL】七种SQL优化方式 你知道几条

1.插入数据 1.1insert 如果我们需要一次性往数据库表中插入多条记录&#xff0c;可以从以下三个方面进行优化。 insert into tb_test values(1,tom); insert into tb_test values(2,cat); insert into tb_test values(3,jerry); 1). 优化方案一 批量插入数据 Insert into t…

CSS 一个好玩的卡片“开卡效果”

文章目录 一、用到的一些CSS技术二、实现效果三、代码 一、用到的一些CSS技术 渐变 conic-gradientbox-shadowclip-path变换、过渡 transform、transition动画 animation keyframes伪类、伪元素 :hover、::before、::after …绝对布局。。。 clip-path 生成网站 https://techb…

新手做TikTok适合哪些类目?

现在很多小伙伴争先恐后想要在TikTok入驻&#xff0c;开店开直播带货赚钱&#xff0c;但是又怕自己是小白&#xff0c;不好拿捏这个平台。TikTok平台&#xff0c;适合小白做吗&#xff1f;现在tiktok千亿级的流量还处于蓝海阶段&#xff0c;想入局要趁早。那么肯定又有小伙伴疑…

PostgreSQL本地化

本地化的概念 本地化的目的是支持不同国家、地区的语言特性、规则。比如拥有本地化支持后&#xff0c;可以使用支持汉语、法语、日语等等的字符集。除了字符集以外&#xff0c;还有字符排序规则和其他语言相关规则的支持&#xff0c;例如我们知道(‘a’,‘b’)该如何排序&…

Ubuntu 升级cuda版本与切换

下载cuda版本 进&#xff1a;CUDA Toolkit 12.2 Downloads | NVIDIA Developer wget https://developer.download.nvidia.com/compute/cuda/12.2.0/local_installers/cuda_12.2.0_535.54.03_linux.runsudo sh ./cuda_12.2.0_535.54.03_linux.run --toolkit --silent --overrid…

快速上手GIT命令,现学也能登堂入室

系列文章目录 手把手教你安装Git&#xff0c;萌新迈向专业的必备一步 GIT命令只会抄却不理解&#xff1f;看完原理才能事半功倍&#xff01; 快速上手GIT命令&#xff0c;现学也能登堂入室 系列文章目录一、GIT HELP1. 命令文档2. 简要说明 二、配置1. 配置列表2. 增删改查3. …

【具身智能】论文系列解读-RL-ViGen ArrayBot USEEK

1. RL-ViGen&#xff1a;视觉泛化的强化学习基准 RL-ViGen: A Reinforcement Learning Benchmark for Visual Generalization 0 摘要与总结 视觉强化学习&#xff08;Visual RL&#xff09;与高维观察相结合&#xff0c;一直面临着分布外泛化的长期挑战。尽管重点关注旨在解…

从C语言到C++_37(特殊类设计和C++类型转换)单例模式

目录 1. 特殊类设计 1.1 不能被拷贝的类 1.2 只能在堆上创建的类 1.3 只能在栈上创建的类 1.4 不能被继承的类 1.5 只能创建一个对象的类(单例模式)(重点) 1.5.1 饿汉模式 1.5.2 懒汉模式 2. 类型转换 2.1 static_cast 2.2 reinterpret_cast 2.3 const_cast 2.4 d…

算法笔记——路径问题

在引入介绍如何写一个算法的时候&#xff0c;我们先引入一个题作为例子 1137. 第 N 个泰波那契数 - 力扣&#xff08;LeetCode&#xff09; 作为刚开始学习算法的我们&#xff0c;看到这个题目的时候&#xff0c;应该想好以下的问题&#xff1a; 1.状态表示 我们要用什么来表…

关于大模型参数微调的不同方法

Adapter Tuning 适配器模块&#xff08;Adapter Moudle&#xff09;可以生成一个紧凑且可扩展的模型&#xff1b;每个任务只需要添加少量可训练参数&#xff0c;并且可以在不重新访问之前任务的情况下添加新任务。原始网络的参数保持不变&#xff0c;实现了高度的参数共享 Pa…