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.mzph.cn/news/802271.shtml

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

相关文章

Hololens2远程音视频通话与AR远程空间标注,基于OpenXR+MRTK3+WebRTC实现

Hololens2远程音视频通话与AR远程空间标注 使用Unity2021.3.21版本开发&#xff0c;基于OpenXRMRTK3.0WebRTC实现。 &#xff08;1&#xff09;通过视频获取视频帧的矩阵的方法可以参考&#xff1a;https://learn.microsoft.com/zh-cn/windows/mixed-reality/develop/advanced…

(学习日记)2024.04.09:UCOSIII第三十七节:事件函数接口

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

七燕论文可靠吗 #经验分享#经验分享

七燕论文是一个非常好用的论文写作工具&#xff0c;它不仅可以帮助学生提高写作效率&#xff0c;还能帮助他们避免抄袭和提高论文质量。七燕论文的查重降重功能非常靠谱&#xff0c;能够帮助用户检测论文中的重复内容&#xff0c;并提供相应的修改建议&#xff0c;确保论文的原…

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

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

CSS设置网页颜色

目录 前言&#xff1a; 1.颜色名字&#xff1a; 2.十六进制码&#xff1a; 3.RGB&#xff1a; 4.RGBA&#xff1a; 5.HSL&#xff1a; 1.hue&#xff1a; 2.saturation&#xff1a; 3.lightness&#xff1a; 6.HSLA&#xff1a; 前言&#xff1a; 我们在电脑显示器&…

Windows 关闭占用指定端口的进程

以下示例以443端口为例&#xff0c;具体哪个端口视自己情况而定 输入命令 # 输出的最后一列就是进程号pid netstat -ano | findstr "443" 找出占用443端口的进程号(pid)&#xff08;第二列是你本机的应用占用的端口&#xff0c;看第二列就行&#xff09;如下图&am…

4 万字 102 道Java经典面试题总结(2024修订版)- 多线程篇

&#x1f345; 作者简介&#xff1a;哪吒&#xff0c;CSDN2021博客之星亚军&#x1f3c6;、新星计划导师✌、博客专家&#x1f4aa; &#x1f345; 哪吒多年工作总结&#xff1a;Java学习路线总结&#xff0c;搬砖工逆袭Java架构师 &#x1f345; 技术交流&#xff1a;定期更新…

关于GNSS硬件延迟初步学习,电离层提取

1、卫星端偏差分为频间和频内偏差&#xff08;inter or intra frequency&#xff09;&#xff0c;下面以GPS的C1C和C2W组合为例分析对PPP解算的影响&#xff1a; 如果不改正卫星端的inter-frequency&#xff08;即&#xff1a;C1C-C1W&#xff09;偏差&#xff08;因为每颗卫星…

AI实时换天解决方案:重塑汽车与旅行拍摄新视界

在汽车拍摄与旅行摄影领域&#xff0c;天空作为画面中的重要元素&#xff0c;往往决定着整体视觉效果的成败。美摄科技作为业界领先的AI视觉技术提供商&#xff0c;近日推出了全新的AI实时换天解决方案&#xff0c;为用户带来了前所未有的创意空间与效率提升。 传统的换天技术…

字母大小写转换(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;char c1 A;char c2 0;//实现大小写转换&#xff1b;c2 c1 32;//输出结果&#xff1b;printf("c2的编码是&…

20240408,C++数组,函数,指针

是谁说回老家学习结果摆烂了两天&#xff0c;是我&#xff0c;Π—Π&#xff01; Π—Π&#xff01;&#xff01; 一&#xff0c;数组——同C 1.1一维数组 1.0 相同类型&#xff0c;连续内存&#xff0c; 1.1 定义格式&#xff1a;数据类型 数组名【长度】&#xff1…

uni-app(H5)论坛 | 社区 表情选择 UI组件

项目源码请移步&#xff1a;bbs 效果 实现思路 表情切换 人物、动物、小黄人不同表情之间的切换实际就是组件的切换 emoji表情 emoji表情本身就是一种字符 如需其他emoji表情可参考 EmojiAll中文官方网站 需要注意的就是数据库的存储格式需要支持emoji表情&#xff0c;我项…

第8章 数据集成和互操作

思维导图 8.1 引言 数据集成和互操作(DII)描述了数据在不同数据存储、应用程序和组织这三者内部和之间进行移动和整合的相关过程。数据集成是将数据整合成物理的或虚拟的一致格式。数据互操作是多个系统之间进行通信的能力。数据集成和互操作的解决方案提供了大多数组织所依赖的…

配置交换机 SSH 管理和端口安全——实验1:配置交换机基本安全和 SSH管理

实验目的 通过本实验可以掌握&#xff1a; 交换机基本安全配置。SSH 的工作原理和 SSH服务端和客户端的配置。 实验拓扑 交换机基本安全和 SSH管理实验拓扑如图所示。 交换机基本安全和 SSH管理实验拓扑 实验步骤 &#xff08;1&#xff09;配置交换机S1 Switch>enab…

【r-tree算法】一篇文章讲透~

目录 一、引言 二、R-tree算法的基本原理 1 数据结构 2 插入操作 3 删除操作 4 查询操作 5 代码事例 三、R-tree算法的性能分析 1 时间复杂度 2 空间复杂度 3 影响因素 四、R-tree算法的变体和改进 1 R*-tree算法 2 X-tree算法 3 QR-tree算法 五、R-tree算法的…

axure谷歌插件(直接下载)

axure谷歌插件 在网上找一个谷歌的axure&#xff0c;不是登陆就是收费&#xff0c;离谱。找了好久才找到这个&#xff0c;我下载保存到网盘了&#xff0c;直接下载就ok&#xff0c;永久无提取码。 下载插件文件&#xff0c;打开开发者模式&#xff0c;直接拖进来就ok。 网盘…

esxi上给centos7虚拟机扩容硬盘

原来centos7硬盘分配的空间只有40GB 需要直接扩容到200GB 扩容前 扩容后 扩容步骤&#xff1a; 1 .在esxi平台上关机虚拟机&#xff0c;将硬盘调整为200GB&#xff0c;然后开机 2.请出chatGPT 1. 创建新分区 使用剩余的磁盘空间创建一个新的分区。你可以使用fdisk&#xf…

Flink Keyed State的优化与实践

本期作者 1.背景 Flink SQL在业务使用中有较多的双流join场景&#xff0c;当左右流的流量都较大&#xff0c;Join的等待时间即使为1小时&#xff0c;Flink Keyed State&#xff08;Flink State分Operator State和Keyed State&#xff0c;后文所有State均代表后者&#xff09;的…

数据库(mysql)-基本查询语句(DQL)

查询语句 这边查询是给予一定表格,这边先做个解释 教师表包括(name(姓名),gender(性别),salary(工资),title(职位),subject_id(课程的编号),comm(奖金)) 学生表包括(姓名(name),gender(性别),job(职位),生日(birth)) 模版 SELECT 字段名 FROM 查询表 WHERE 查询语句 或与非…

k8s_入门_命令详解

命令详解 kubectl是官方的CLI命令行工具&#xff0c;用于与 apiserver进行通信&#xff0c;将用户在命令行输入的命令&#xff0c;组织并转化为 apiserver能识别的信息&#xff0c;进而实现管理k8s各种资源的一种有效途径 1. 帮助 2. 查看版本信息 3. 查看资源对象等 查看No…