递归搜索与回溯专题篇一

news2024/11/14 20:42:53

目录

组合

目标和

组合总和

字母大小全排列


组合

题目

思路

解决这道题利用DFS,决策树是怎样的?以n=4,k=3为例:

因为每个数只用到一次,因此需要剪枝,将出现重复数字的枝剪掉,因为组合中元素的先后顺序没有影响,因此需要将小于对应位置值的值剪掉,即从该位置的值后面的值进行DFS。

代码

class Solution {
    vector<vector<int>> ret;
    vector<int> path;
public:
    vector<vector<int>> combine(int n, int k) {
        dfs(n,k,1);
        return ret;
    }

    void dfs(int n,int k,int pos){
        if(path.size()==k){
            ret.push_back(path);
            return;
        }
        for(int i=pos;i<=n;i++){
            path.push_back(i);
            dfs(n,k,i+1);
            path.pop_back();
        }
    }
};
目标和

题目

思路

这道题无非是给每个位置添加上‘+’或‘-’号,针对每个位置的值,无非是两种情况,添加‘+’或‘-’号,因此针对每个位置的两种情况进行DFS,当处理完最后一个位置的数后,判断得到的值是否等于target,如果等于,就对次数进行++.

代码

class Solution {
    int ret,aim;

public:
    int findTargetSumWays(vector<int>& nums, int target) {
        aim=target;
        dfs(nums,0,0);
        return ret;
    }

    void dfs(vector<int>& nums,int pos,int path){
        if(pos==nums.size()){
            if(path==aim)
                ret++;
            return;
        }
        dfs(nums,pos+1,path+nums[pos]);
        dfs(nums,pos+1,path-nums[pos]);
    }
};
组合总和

题目

思路

解决这道题将采用两种解法,但是两种解法都是利用DFS。

解法一

分析每个位置放什么数因为题目中说明无重复元素且同一个元素可以无限制重复被选取,因此对每个位置进行DFS时,递归的位置可以依旧是原来的位置的值,递归出口是:总和等于target,或者总和大于target,或者递归位置大于数组的最后一个元素的位置。

代码

 class Solution {
 public:
     vector<vector<int>> vv;
     vector<int> v;

     vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
         dfs(candidates,target,0,0);
         return vv;
     }

     void dfs(vector<int>& candidates, int target,int pos,int sum){
         if(sum==target){
             vv.push_back(v);
             return;
         }
         if(sum>target || pos==candidates.size()) return;
         //分析每个位置放什么数
         for(int i=pos;i<candidates.size();i++){
             v.push_back(candidates[i]);
             dfs(candidates,target,i,sum+candidates[i]);
             v.pop_back();
         }
     }
 };
解法二

分析每个数使用多少次,直到总和大于target为止,递归出口是:总和等于target,或者总和大于target,或者递归位置大于数组的最后一个元素的位置。

代码

class Solution {
public:
    vector<vector<int>> vv;
    vector<int> v;

    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        dfs(candidates,target,0,0);
        return vv;
    }

    void dfs(vector<int>& candidates, int target,int pos,int sum){
        if(sum==target){
            vv.push_back(v);
            return;
        }
        if(sum>target || pos==candidates.size()) return;
        //枚举每个数的个数
        for(int k=0;k*candidates[pos]+sum<=target;k++){
            if(k) v.push_back(candidates[pos]);
            dfs(candidates,target,pos+1,sum+k*candidates[pos]);
        }
        //恢复现场
        for(int k=1;k*candidates[pos]+sum<=target;k++)
            v.pop_back();
    }
};
字母大小全排列

题目

思路

解决这道题依旧是使用DFS,对于是数字的位置不做任何处理,针对每个位置无非是两种情况,如果是小写字母,可以依旧是小写字母,也可以转换成大写字母;如果是大写字母,可以依旧是大写字母,也可以转换成小写字母。

代码

class Solution {
    vector<string> ret;
    
public:
    vector<string> letterCasePermutation(string s) {
        string str;
        dfs(s,0,str);
        return ret;
    }

    void dfs(string& s,int pos,string str){
        if(pos==s.size()){
            ret.push_back(str);
            return;
        }
        char ch=s[pos];
        //不改变
        dfs(s,pos+1,str+ch);
        //改变
        if(ch>'9'){
            ch=change(ch);
            dfs(s,pos+1,str+ch);
        }
    }

    char change(char ch){
        if(ch>='a' && ch<='z') ch-=32;
        else if(ch>='A' && ch<='Z') ch+=32;
        return ch;
    }
};
优美的排列

题目

思路

解决这道题依旧是使用DFS,因为每个数字只能被使用一次,因此每使用一个数字,都需要对该数字进行标记,递归的出口是递归位置是第n+1个位置,递归时,从头到尾扫描,看该位置的值是否被使用过且满足要么perm[i]能够被i整除,要么i能被perm[i]整除。

代码

class Solution {
    bool vis[16];
    int ret;
public:
    int countArrangement(int n) {
        dfs(n,1);
        return ret;
    }

    void dfs(int n,int pos){
        if(pos==n+1){
            ret++;
            return;
        }
        for(int i=1;i<=n;i++){
            if(!vis[i] && (i%pos==0 || pos%i==0)){
                vis[i]=true;
                dfs(n,pos+1);
                vis[i]=false;
            }
        }
    }
};

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

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

相关文章

Vue中的this.$emit()方法详解【父子组件传值常用】

​在Vue中&#xff0c;this.$emit()方法用于触发自定义事件。它是Vue实例的一个方法&#xff0c;可以在组件内部使用。 使用this.$emit()方法&#xff0c;你可以向父组件发送自定义事件&#xff0c;并传递数据给父组件。父组件可以通过监听这个自定义事件来执行相应的逻辑。 …

【PyQt6 应用程序】QTDesigner生成ui文件转成py源码并执行

要使用Qt Designer设计的UI界面生成Python代码并执行需要遵循几个步骤。确保已经安装了PyQt6和Qt Designer。Qt Designer是一个强大的工具,允许通过拖放组件来设计GUI界面,而不需要手写所有的代码。安装PyQt6时 Qt Designer通常会一起被安装。 文章目录 使用Qt Designer设计U…

米联客FDMA3.2源码分析以及控制BRAM、DDR3读写验证

文章目录 一、FDMA简介二、读写操作时序2.1 写时序2.2 读时序 三、FDMA源码分析四、源码仿真验证4.1 FDMA控制代码4.2 系统框图4.3 仿真结果4.3.1 写通道4.3.2 读通道 五、使用FDMA控制BRAM读写测试5.1 系统框图5.2 读写数据控制模块5.3 仿真结果5.4 下板验证 六、使用FDMA控制…

快讯 | 美军500天AI计划启动,“破解AI“与“反AI“策略亮相

在数字化浪潮的推动下&#xff0c;人工智能&#xff08;AI&#xff09;正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展&#xff0c;捕捉行业动态&#xff1b;提供深入的新闻解读&#xff0c;助您洞悉技术背后的逻辑&#xff1b;汇聚行业专家的见解&#xff0c;…

VBA之正则表达式(46)-- 解析业务逻辑公式

实例需求&#xff1a;某业务系统的逻辑公式如下所示&#xff08;单行文本&#xff09;&#xff0c;保存在活动工作表的A1单元格中。 "DSO_90Day"->"FA_NoFunc"->"FCCS_No Intercompany"->"FCCS_Data Input"->"FCCS_…

<数据集>非洲动物识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;1504张 标注数量(xml文件个数)&#xff1a;1504 标注数量(txt文件个数)&#xff1a;1504 标注类别数&#xff1a;4 标注类别名称&#xff1a;[buffalo, elephant, rhino, zebra] 序号类别名称图片数框数1buffalo3…

Java生成一个5位的随机验证码(大小写字母和数字)

生成验证码 内容&#xff1a;可以是小写字母&#xff0c;也可以是大写字母&#xff0c;还可以是数字 规则&#xff1a;长度为5 内容中四位字母&#xff0c;一位数字 其中数字只有一位&#xff0c;但是可以出现在任意位置。 package test;impo…

arm-Pwn环境搭建+简单题目

前言 起因是看到一篇IOT CVE的分析文章。 正好也在学pwn&#xff0c;arm架构的也是IOT这些固件最常用的&#xff0c;所以先安一个arm-pwn的环境。 环境搭建/调试 1. 安装 gdb-multiarch sudo apt-get install gdb-multiarch2. 安装qemu ctf的arm_pwn只需要安装qemu-user就…

结构体内存的对齐

结构体的对齐规则 第一个成员在结构体变量偏移量为0的地址处。 其他成员变量要对齐到某个数字&#xff08;对齐数&#xff09;的整数倍的地址处 1&#xff09; 对齐数 min( 编译器默认的一个对齐数, 该成员大小&#xff09;。 2&#xff09;默认的对齐数&#xff0c;可以通过宏…

kafka的12个重要概念

kafka的12个重要概念 1、服务器broker1.1、Broker 的主要功能1.2、Kafka Broker 的架构1.3、配置和管理1.4、高可用性和负载均衡1.5、总结 2、主题topic2.1、主要特点 3、事件Event4、生产者producer4.1、主要功能4.2、Producer 的配置选项4.3、Producer 的工作流程4.4、总结 5…

(javaweb)maven高级

目录 ​编辑 1.分模块设计与开发 2.继承与聚合--继承关系实现 3.继承与聚合--版本锁定 4.继承与聚合--聚合版本 5.私服 资源的上传与下载 1.分模块设计与开发 分模块&#xff1a;拆分成多个模块进行开发 不分模块&#xff1a;业务代码堆积成一个 不利于项目管理和维护并…

考研数学|零基础9月开始100天备考攻略

马上就要9月了&#xff0c;很多同学相比快要结束强化了&#xff0c;零基础的同学&#xff0c;进度可能会慢一些&#xff0c;但是别担心&#xff0c;考研数学的学习&#xff0c;进度不是最要紧的&#xff0c;学习效果才是&#xff01;千万不要比进度&#xff0c;也不要赶进度&am…

Linux中的PCI配置空间

在计算机系统中&#xff0c;PCI&#xff08;Peripheral Component Interconnect&#xff09;总线是一种用于连接硬件设备的标准接口。PCI总线提供了一个通用的、高性能的数据传输通道&#xff0c;广泛应用于PC系统和服务器中。在Linux操作系统中&#xff0c;PCI设备的配置空间是…

Modern C++——不准确“类型声明”引发的非必要性能损耗

大纲 案例代码地址 C是一种强类型语言。我们在编码时就需要明确指出每个变量的类型&#xff0c;进而让编译器可以正确的编译。看似C编译器比其他弱类型语言的编译器要死板&#xff0c;实则它也做了很多“隐藏”的操作。它会在尝试针对一些非预期类型进行相应转换&#xff0c;以…

JS脚本实现RPA模拟人工操作网页获取数据

一、首先我们可以根据查询条件去预置一个Excel&#xff0c;比如我们以公司名称为例。 二、然后我们用JS读取Excel内容&#xff0c;进行页面打开与条件记录 <!DOCTYPE html> <html> <div style"text-align: center;margin-top: 300px;"><input …

一款人性化的终端用户界面工具

A collection of human friendly terminal user interface. 截图 历史文件预览 注意: find file 依赖 fzf. file browser依赖 ranger / lf / … 安装 git clone https://github.com/StubbornVegeta/StartUp ~/.config/ cd ~/.config/StartUp ./install.sh用法 . $HOME/.…

【binder】【android12】【2.servicemanager启动——全源码分析】

系列文章目录 可跳转到下面链接查看下表所有内容https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501文章浏览阅读2次。系列文章大全https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501 目录 …

浅谈【数据结构】树与二叉树二

目录 1、二叉排序树 1.1二叉树排序树插入 1.1.1两种插入方法 1.1.2循环法 1.1.3递归法 1.2二叉树的打印 1.3二叉树的结点删除 1.4销毁二叉树 1.5层次打印 谢谢帅气美丽且优秀的你看完我的文章还要点赞、收藏加关注 没错&#xff0c;说的就是你&#xff0c;不用再怀疑&…

前端实现 http请求中 表单请求体和json请求体的互相转换,外加转为 冒号换行格式,用于ApiFox批量导入

在线体验&#xff1a;https://ikaros-521.github.io/dev_tool/http/param_json_converter.html 直接上源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Query String to JSON Converter</titl…

慢SQL定位及优化

1.如何定位慢查询 方案1&#xff1a;开源工具 调式工具&#xff1a;Arthas 运维工具&#xff1a;Prometheus、Skywalking 方案2&#xff1a;MySQL自带慢日志 慢查询日志记录了所有执行时间超过指定参数&#xff08;long_query_time&#xff0c;单位&#xff1a;秒&#xff0c…