DFS:深搜+回溯+剪枝解决排列、子集问题

                                    创作不易,感谢三连支持!! 

一、全排列I

. - 力扣(LeetCode)

class Solution {
public://全局变量vector<vector<int>> ret;vector<int> path;bool check[6];vector<vector<int>> permute(vector<int>& nums) {dfs(nums);return ret;}void dfs(vector<int>& nums){if(nums.size()==path.size()) {ret.push_back(path); return;}for(int i=0;i<nums.size();++i){if(check[i]==false) //说明没选过{path.push_back(nums[i]);check[i]=true;//减枝dfs(nums);//继续去下一个找//回溯path.pop_back();check[i]=false;}}}
};

二、全排列II

. - 力扣(LeetCode)

 方案1:不合法就continue

class Solution {
public:vector<vector<int>> ret;vector<int> path;bool check[8];vector<vector<int>> permuteUnique(vector<int>& nums) {sort(nums.begin(),nums.end());dfs(nums);return ret;}void dfs(vector<int>& nums){if(nums.size()==path.size()) {ret.push_back(path);return;}//思路1:考虑不合法的选择 continue   思路2:考虑合法的才进dfsfor(int i=0;i<nums.size();++i){if(check[i]==true||(i!=0&&nums[i]==nums[i-1]&&check[i-1]==false))  continue;path.push_back(nums[i]);check[i]=true;dfs(nums);//去下一层找path.pop_back();check[i]=false;}}
};

方案2:合法才能进循环

class Solution {
public:vector<vector<int>> ret;vector<int> path;bool check[8];vector<vector<int>> permuteUnique(vector<int>& nums) {sort(nums.begin(),nums.end());dfs(nums);return ret;}void dfs(vector<int>& nums){if(nums.size()==path.size()) {ret.push_back(path);return;}//思路1:考虑不合法的选择 continue   思路2:考虑合法的才进dfsfor(int i=0;i<nums.size();++i){if(check[i]==false&&(i==0||nums[i]!=nums[i-1]||check[i-1]==true))  {path.push_back(nums[i]);check[i]=true;dfs(nums);//去下一层找path.pop_back();check[i]=false;}}}
};

三、优美的排列

. - 力扣(LeetCode)

class Solution {
public:  //类似全排列,可以交换位置但是不能重复int ret=0;bool check[16];int countArrangement(int n){dfs(1,n);return ret;}void dfs(int pos,int n){if(pos==n+1) {++ret;return;}for(int i=1;i<=n;++i){if(check[i]==false&&(i%pos==0||pos%i==0)){check[i]=true;dfs(pos+1,n);check[i]=false;}}}
};

四、子集I

. - 力扣(LeetCode)

 策略1:决策树以选不选作为参考,结果为叶子节点

class Solution {
public://设置全局变量vector<vector<int>> ret;vector<int> path;//记录路径
public:vector<vector<int>> subsets(vector<int>& nums) {dfs(nums,0);return ret;}void dfs(vector<int>& nums,int pos){if(pos==nums.size()) { ret.push_back(path);  return;}//选 path.push_back(nums[pos]);dfs(nums,pos+1);path.pop_back();//回溯//不选dfs(nums,pos+1);}
};

策略2:决策树以选几个为参考,结果为全部节点 

class Solution {
public://设置全局变量vector<vector<int>> ret;vector<int> path;
public:vector<vector<int>> subsets(vector<int>& nums) {dfs(nums,0);return ret;}void dfs(vector<int>& nums,int pos){ret.push_back(path);//每一个决策都是结果for(int i=pos;i<nums.size();++i){path.push_back(nums[i]);dfs(nums,i+1);   path.pop_back();         }}
};

五、子集II

. - 力扣(LeetCode)

 

class Solution {
public:vector<vector<int>> ret;vector<int> path;vector<vector<int>> subsetsWithDup(vector<int>& nums) {sort(nums.begin(), nums.end());dfs(nums,0);return ret;}void dfs(vector<int>& nums,int pos){ret.push_back(path);for(int i=pos;i<nums.size();++i){if(i>pos&&nums[i]==nums[i-1]) continue;path.push_back(nums[i]);dfs(nums,i+1);path.pop_back();}}
};

六、找出所有子集的异或总和再求和

. - 力扣(LeetCode)

class Solution {int sum=0;//记录总和int path=0;//记录路径
public:int subsetXORSum(vector<int>& nums) {dfs(nums,0);return sum;}void dfs(vector<int>& nums,int pos){sum+=path;for(int i=pos;i<nums.size();++i){path^=nums[i];dfs(nums,i+1);path^=nums[i];//利用消消乐的性质恢复现场}}
};

七、字母大小写全排列

. - 力扣(LeetCode)

class Solution {
public:vector<string> ret; //找返回值vector<string> letterCasePermutation(string s) {dfs(s,0);return ret;}void dfs(string s,int pos)//用传值s 可以直接在原来的s上进行修改{while(pos<s.size()&&isdigit(s[pos])) ++pos;if(pos==s.size()) {ret.push_back(s); return;}//变s[pos]^=32;  //^=32(空格)可以完成大小写转化!!dfs(s,pos+1);s[pos]^=32;//不变dfs(s,pos+1);}
};

八、下一个排列

. - 力扣(LeetCode)

class Solution {
public:void nextPermutation(vector<int>& nums) {if(nums.size()==1) return;//如果只有一个数,就没有必要去修改了//思路,找尽可能靠右的低位,与一个尽可能小的大数交换 然后再升序后面的剩余元素for(int i=nums.size()-2;i>=0;--i){if(nums[i]<nums[i+1]) {for(int j=nums.size()-1;j>i;--j){if(nums[i]<nums[j]) //找到第一个比i大,{swap(nums[i],nums[j]);sort(nums.begin()+i+1,nums.end());//i位置后面的数升序return;//此时返回结果}}}}//如果循环结束都没有找到第一个升序的,说明是全逆序,此时的结果应该是把你直接变成升序sort(nums.begin(),nums.end());}
};

九、排列序列

. - 力扣(LeetCode)​​​​​​

class Solution {
public:string getPermutation(int n, int k) {vector<int> factorial(n);//用来统计各个阶乘factorial[0]=1;for(int i=1;i<n;++i)//统计1——(n-1)!的阶乘{factorial[i]= factorial[i-1]*i;}--k;//康托展开 vector<int> check(n+1,1);//可选数string ret;ret.reserve(n);for(int i=1;i<=n;++i){int order=k/factorial[n-i]+1;//确定了康拖的首位for(int j=1;j<=n;++j)//告诉check数组,该位置得是0 不能再选{order-=check[j];if(order==0){ret.push_back(j+'0');check[j]=0;//说明此数被选过break;}}k%=factorial[n-i];//去找下一个数}return ret;}
};

     排列和子集问题就总结到这啦!!回溯有关的题关键就是画树状图,然后根据树状图去思考怎么进行深搜、回溯和剪枝!!

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

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

相关文章

DDD 的四层领域模型是怎样的?包含哪些基础概念?

DDD的四层领域模型如下所示&#xff1a; 展现层&#xff1a;这一层负责向用户显示信息和解释用户命令&#xff0c;完成前端界面逻辑。并将用户请求传递给应用层。应用层&#xff1a;这一层是很薄的一层&#xff0c;负责协调领域层中的领域对象&#xff0c;组成具体应用场景。应…

深度解析Elasticsearch索引数据量过大的优化与部署策略

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 引言 一. 分片和副本策略 1.1分片策略 1.1.1 数据量 1.1…

springCloudAlibaba集成gateWay实战(详解)

一、初识网关&#xff1f; 1、网关介绍 ​ 在微服务架构中&#xff0c;一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢&#xff1f;如果没有网关的存在&#xff0c;我们只能在客户端记录每个微服务的地址&#xff0c;然后分别去调用。这样的话…

python爬虫———urllibd的基本操作(第十二天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

画图理解JVM相关内容

文章目录 1. JVM视角下&#xff0c;内存划分2. 类内存分布硬核详解1. 获取堆内存参数2. 扫描堆内存&#xff0c;定位实例3. 查看实例所在地址的数据4. 找到实例所指向的类信息的地址5. 查看class信息6. 结论 3. Java的对象创建流程4. 垃圾判别算法4.1 引用计数法4.2 可达性分析…

【Redis】NoSQL之Redis的配置和优化

关系型数据库与非关系型数据库 关系型数据库 关系型数据库是一个结构化的数据库&#xff0c;创建在关系型模型&#xff08;二维表&#xff09;的基础上&#xff1b;一般面向于记录&#xff1b; SQL语句(标准数据查询语句)就是一种基于关系型数据库的语言&#xff0c;用于执行…

Mysql底层原理五:如何设计、用好索引

1.索引的代价 空间上的代价 时间上的代价 每次对表中的数据进⾏增、删、改操作时&#xff0c;都需要去修改各个B树索引。⽽且我们讲过&#xff0c;B树每层节点都是按照索引列的值从⼩到⼤的顺序排序⽽组成了双 向链表。不论是叶⼦节点中的记录&#xff0c;还是内节点中的记录&a…

设计模式 -- 发布订阅模式

发布订阅模式&#xff1a; 订阅者把自己想订阅的事件注册到调度中心&#xff0c;当发布者发布该事件到调度中心&#xff0c;也就是该事件触发时&#xff0c;由调度者统一调度订阅者注册到调度中心的处理代码。 在javaScript 中我们一般使用事件模型来代替传统的发布订阅模式。 …

深入了解iOS内存(WWDC 2018)笔记-内存诊断

主要记录下用于分析iOS/macOS 内存问题的笔记。 主要分析命令&#xff1a; vmmap, leaks, malloc_history 一&#xff1a;前言 有 3 种思考方式 你想看到对象的创建吗&#xff1f;你想要查看内存中引用对象或地址的内容吗&#xff1f;或者你只是想看看 一个实例有多大&#…

互联网大厂ssp面经之路:计算机网络part2

什么是 HTTP 和 HTTPS&#xff1f;它们之间有什么区别&#xff1f; a. HTTP&#xff08;超文本传输协议&#xff09;和HTTPS&#xff08;安全超文本传输协议&#xff09;是用于在Web上传输数据的协议。它们之间的区别在于安全性和数据传输方式。 b. HTTP是一种不安全的协议&…

【随笔】Git 高级篇 -- 整理提交记录(上)cherry-pick(十五)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

加州大学欧文分校英语基础语法专项课程03:Simple Past Tense 学习笔记(完结)

Learn English: Beginning Grammar Specialization Specialization Certificate course 3&#xff1a; Simple Past Tense Course Certificate 本文是学习 https://www.coursera.org/learn/simple-past-tense 这门课的学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。…

浙江大学李春阳团队Trends Plant Sci观点文章(IF=20):植物地下生态互作:为什么同性相斥,异性相吸?

在生态学中&#xff0c;人们一直致力于探究生物之间的相互作用&#xff0c;这些相互作用不仅包括物种之间的相互作用&#xff0c;还包括同一物种的不同性别之间的相互作用。对于异株植物物种来说&#xff0c;人们普遍认为异性之间的相互作用比同性之间的相互作用更弱&#xff0…

为说阿拉伯语的国家进行游戏本地化

阿拉伯语是由超过4亿人使用的语言&#xff0c;并且是二十多个国家的官方语言。进入这些国家的市场并非易事——虽然他们共享一种通用语言&#xff0c;但每个国家都有自己独特的文化&#xff0c;有自己的禁忌和对审查的处理方式。这就是为什么视频游戏公司长期以来都远离阿拉伯语…

Git如何将已经推送到服务器的文件夹“忽略”

例子&#xff1a;如果我们在推送之初&#xff0c;一股脑将工程的所有文件都备份&#xff0c;没有忽略 debug和release文件夹&#xff0c;反应过来想要将文件夹再次忽略&#xff0c;应该怎么操作呢&#xff1f; 如下解答方法&#xff1a; 1.在工程目录下新建文件 .gitignore …

graphicLayer.startDraw({指定type为curve曲线时,无法实现示例效果排查思路参考

graphicLayer.startDraw({指定type为curve曲线时&#xff0c;无法实现和示例一样的曲线效果的排查思路参考&#xff1a; 相关代码&#xff1a; graphicLayer.startDraw({type: "curve",style: {color: "#ff0000",width: 3,},}); 相关效果&#xff1a; …

创建型模式--4.抽象工厂模式【弗兰奇一家】

1. 奔向大海 在海贼世界中&#xff0c;位于水之都的弗兰奇一家是由铁人弗兰奇所领导的以拆船为职业的家族&#xff0c;当然了他们的逆向工程做的也很好&#xff0c;会拆船必然会造船。船是海贼们出海所必备的海上交通工具&#xff0c;它由很多的零件组成&#xff0c;从宏观上看…

Mathpix和Simpletex对比

原始资料 Mathpix结果 已知集合 A { y ∣ y 2 x } , B { x ∣ x ≥ a } A\left\{y \mid y2^{\sqrt{x}}\right\}, B\{x \mid x \geq a\} A{y∣y2x ​},B{x∣x≥a}, 若 A B AB AB, 则 a a a 的值为 ( ) A. 1 B. 2 C. 3 D. 4复数 z a i ( a ∈ R , i za\mathrm{i} \qua…

React - 你知道useffect函数内如何模拟生命周期吗

难度级别:中级及以上 提问概率:65% 很多前端开发人员习惯了Vue或者React的组件式开发,熟知组件的周期过程包含初始化、挂载完成、修改和卸载等阶段。但是当使用Hooks做业务开发的时候,看见一个个useEffect函数,却显得有些迷茫,因为在us…

windows安装使用nacos

1.下载安装包 网址&#xff1a;Releases alibaba/nacos GitHub 2.解压&#xff0c;bin目录下修改启动脚本为单机 3.修改数据库配置&#xff0c;使用本地mysql数据库 3.1 创建nacos数据库 3.2 执行 nacos\conf 目录下数据库脚本 4.修改nacos\conf目录下数据库配置 5.点击运…