【三十三】【算法分析与设计】回溯(1),46. 全排列,78. 子集,没有树结构,但是依旧模拟树结构,回溯,利用全局变量+递归函数模拟树结构

46. 全排列

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

示例 1:

输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

示例 2:

输入:nums = [0,1] 输出:[[0,1],[1,0]]

示例 3:

输入:nums = [1] 输出:[[1]]

提示:

  • 1 <= nums.length <= 6

  • -10 <= nums[i] <= 10

  • nums 中的所有整数 互不相同

定义dfs递归函数,当前树的所有有效序列填充到 ret 数组。

定义ret数组存储全排列序列。

定义path存储根节点到当前节点的路径。

定义check数组,存储当前节点哪些元素是我们的孩子节点,哪些元素不是我们的孩子节点。

维护dfs递归函数内部逻辑,第一个位置选择一个孩子节点作为路径,然后将子树的所有有效序列填充到ret数组中。

递归函数的出口,当path.size()==nums.size(),ret.push_back(path); return;

 
class Solution {vector<vector<int>> ret;vector<int> path;vector<bool> check;public:vector<vector<int>> permute(vector<int>& nums) {check.resize(7);dfs(nums);return ret;}void dfs(vector<int>& nums) {if (path.size() == nums.size()) {ret.push_back(path);return;}int n = nums.size();for (int i = 0; i < n; i++) {if (!check[i]) {path.push_back(nums[i]);check[i] = true;dfs(nums);path.pop_back();check[i] = false;}}}
};

78. 子集

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的

子集

(幂集)。

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

示例 1:

输入:nums = [1,2,3] 输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

示例 2:

输入:nums = [0] 输出:[[],[0]]

提示:

  • 1 <= nums.length <= 10

  • -10 <= nums[i] <= 10

  • nums 中的所有元素 互不相同

第一个位置元素选或者不选,第二个位置元素选或者不选,以此类推。

定义dfs将数中所有有效节点填充到ret数组中,i表示当前节点是否选择i位置元素。

定义ret数组存储子集序列。

定义path存储根节点到当前节点的路径。

维护dfs递归内部逻辑,对于 i 位置的元素,选或者不选,如果不选,将子树的所有有效序列填充到ret数组中。

如果选,将子树的所有有效序列填充到ret数组中。

选与不选的时候,将i++传入下一个节点,此时在本次的节点中,依旧需要维护 i 的意义,所以dfs后都需要 i--操作。

如果dfs不传引用,就不需要主动i--操作,系统自动维护 i 的意义。

选择之后在当前的节点中,还需要维护path的意义。

递归的出口,当i==nums.size(),ret.push_back(path); return;

 
class Solution {
public:vector<vector<int>> ret;vector<int> path; // 根节点到当前节点的路径vector<vector<int>> subsets(vector<int>& nums) {// 定义dfs递归函数填充retint i=0;dfs(nums, i);return ret;}void dfs(vector<int>& nums, int& i) {if (i == nums.size()) {ret.push_back(path);return;}// 不选dfs(nums, ++i);i--;// 选path.push_back(nums[i]);dfs(nums, ++i);i--;path.pop_back();}
};

子集的元素有零个,一个,两个,以此类推。

定义dfs递归函数,将树中每一个节点都填充到ret数组中,pos表示子树节点添加的数字的开始下标。

定义path存储当前节点的序列。

定义ret存储子集序列。

递归函数内部逻辑,首先将path添加到ret数组中。然后进入下一个节点当中,维护path,和pos

递归出口,在维护完ret后,如果pos==nums.size()此时返回return

 
class Solution {
public:vector<vector<int>> ret;vector<int> path; vector<vector<int>> subsets(vector<int>& nums) {// 定义dfs递归函数填充retint pos = 0;dfs(nums, pos);return ret;}void dfs(vector<int>& nums, int pos) {ret.push_back(path);if (pos == nums.size())return;for (int i = pos; i < nums.size(); i++) {path.push_back(nums[i]);dfs(nums, i + 1);path.pop_back();}}
};

结尾

最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。

同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。

谢谢您的支持,期待与您在下一篇文章中再次相遇!

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

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

相关文章

【C++】C++ primer plus 第七、八章--函数

函数指针 使用typedef声明函数指针 typedef const double* (*p)(const double*, int);const double* func1(const double* a, int b){auto *c = new(double);*c = *a * b;return c; } // p则可以作为函数指针类型 p f = func1; 内联函数 使用关键字inline声明,在编译过程中…

缺陷检测项目 | 使用OpenCV实现纺织品表面缺陷检测

项目应用场景 面向纺织品表面缺陷检测场景&#xff0c;使用 OpenCV 来实现&#xff0c;因此无需深度学习复杂的训练流程&#xff0c;实现起来会更加便捷。 项目效果&#xff1a; 项目细节 > 具体参见项目 README.md 项目采用 VisualStudio C# 开发&#xff0c;所以用 Visua…

详解SPWM与SVPWM的原理、算法以及两者的区别

详解SPWM与SVPWM的原理、算法以及两者的区别 1、SPWM与SVPWM 2、SPWM与SVPWM的原理 2.1 SPWM原理 2.2 SVPWM原理 3、SPWM与SVPWM的算法 3.1 SPWM算法 3.2 SVPWM 算法 4、SPWM和SVPWM的对比 5、总结 1、SPWM与SVPWM 所谓SPWM,就是在PWM的基础上改变了调制脉冲方式,…

AcWing---转圈游戏---快速幂

太久没写快速幂了... 这是一道数学题orz&#xff0c;能看出来的话答案就是 &#xff0c;但是很大&#xff0c;同时还要mod n&#xff0c;直接用快速幂即可。 快速幂模版&#xff1a; long long int power(long long int a,long long int b,long long int mod){long long int r…

golang特性3

golang特性 通过通信共享内存 在 Go 中&#xff0c;通信共享内存是通过通道来实现的。Go 语言的设计哲学之一就是“不要通过共享内存来通信&#xff0c;而应通过通信来共享内存”。这意味着不鼓励直接在多个协程之间共享内存&#xff0c;而是通过通道进行数据交换&#xff0c…

C语言.指针(4)

指针&#xff08;4&#xff09; 1.回调函数是什么&#xff1f;2.qsprt使用举例2.1使用qsort函数排序整型数据2.2使用qsort函数排序结构体数据 3.qsort函数的模拟实现 1.回调函数是什么&#xff1f; 回调函数就是一个通过函数指针调用的函数 如果你把函数的指针&#xff08;地址…

Java集合体系面试题

1. Java中有哪些主要的集合接口&#xff1f; 答案&#xff1a;Java中主要的集合接口有Collection、List、Set、Queue和Map。 2. 请解释List和Set之间的主要区别。 答案&#xff1a;List和Set的主要区别在于元素的顺序和唯一性。List是有序的集合&#xff0c;允许存储重复的元…

PHP安装swoole拓展

一&#xff1a;下载swoole拓展 PHP的swoole拓展下载地址&#xff1a;https://pecl.php.net/package/swoole wget http://pecl.php.net/get/swoole-4.2.12.tgz二&#xff1a;安装swoole拓展 1&#xff1a;解压swoole拓展包 tar xzvf swoole-4.2.12.tgz cd swoole-4.2.122&am…

pandas(day6 图表)

一. 计算效率 1. 测量代码运行时间 %%time %%timeit 单纯计算 代码块执行的时长 %%time _sum(np.arange(6)) CPU times: total: 0 ns Wall time: 1.66 ms用于多次运行代码块并计算平均执行时间 %%timeit _sum(np.arange(6))738 ns 10.7 ns per loop (mean std. dev. of 7…

java常用设计模式介绍及代码示例

设计模式是在软件设计中发现、研究和应用的一种有效方法。设计模式并不直接转化成代码&#xff0c;而是提供了解决某一问题的框架。下面介绍一些常用的设计模式以及对应的Java代码示例&#xff1a; 1. 单例模式&#xff1a;确保某一个类只有一个实例&#xff0c;同时提供一个访…

java流式计算Stream

java流式计算Stream 流(Stream)到底是什么呢? 是数据渠道&#xff0c;用于操作数据源&#xff08;集合、数组等&#xff09;所生成的元素序列。 “集合讲的是数据&#xff0c;流讲的是计算! ” 特点&#xff1a; Stream自己不会存储元素。 Stream不会改变源对象。相反&#x…

金三银四面试题(十六):MySQL面试都问什么(1)

在开发岗位面试中&#xff0c;MySQL基本是必考环节。所以接下来我们就进入MySQL八股文环节&#xff0c;看看都有哪些高频考题。 MySQL 中有哪些不同的表格&#xff1f; 在MySQL中&#xff0c;可以创建多种不同类型的表格&#xff0c;其中一些常见的类型包括&#xff1a; InnoD…

代码随想录第18天: 二叉树part05

力扣513 找树左下角的值 class Solution {public int findBottomLeftValue(TreeNode root) {Queue<TreeNode> que new LinkedList<>();que.offer(root);int res 0;while(!que.isEmpty()) {int size que.size();for(int i 0; i < size; i) {TreeNode tmp q…

Git(8)之分支间同步特定提交

Git(8)之分支间同步特定提交 Author&#xff1a;Once Day Date&#xff1a;2024年4月7日 漫漫长路有人对你微笑过嘛… 全系列文章可查看专栏: Git使用记录_Once_day的博客-CSDN博客 文章目录 Git(8)之分支间同步特定提交1. 分支间同步提交2. cherry-pick同步分支间的特定提交…

docker打包haproxy并代理web或mysql集群

1、需求&#xff1a; 使用haproxy代理两个服务&#xff08;web服务或者是mysql服务&#xff09; 2、编写Dockerfile 2.1、创建Dockerfile专用目录 mkdir /docker/images/haproxy -p && cd /docker/images/haproxy 2.2、下载软件包到Dockerfile专用目录 curl -O h…

性能优化-如何爽玩多线程来开发

前言 多线程大家肯定都不陌生&#xff0c;理论滚瓜烂熟&#xff0c;八股天花乱坠&#xff0c;但是大家有多少在代码中实践过呢&#xff1f;很多人在实际开发中可能就用用Async&#xff0c;new Thread()。线程池也很少有人会自己去建&#xff0c;默认的随便用用。在工作中大家对…

ThingsBoard通过MQTT发送属性数据

MQTT基础 客户端 MQTT连接 属性上传API 案例 MQTT基础 MQTT是一种轻量级的发布-订阅消息传递协议&#xff0c;它可能最适合各种物联网设备。 你可以在此处找到有关MQTT的更多信息&#xff0c;ThingsBoard服务器支持QoS级别0&#xff08;最多一次&#xff09;和QoS级别1&…

3D打印技术引领压铸模具制造新变革

随着工业4.0浪潮的席卷&#xff0c;3D打印技术以其独特优势&#xff0c;正逐渐成为新一轮工业革命中的璀璨明星。这一技术不仅为“中国制造”向“中国智造”的转型提供了强大动力&#xff0c;也为压铸模具这一铸造行业的重要分支带来了前所未有的变革。 压铸模具&#xff0c;作…

文心一言指令词宝典之咨询分析篇

作者&#xff1a;哈哥撩编程&#xff08;视频号、抖音、公众号同名&#xff09; 新星计划全栈领域优秀创作者博客专家全国博客之星第四名超级个体COC上海社区主理人特约讲师谷歌亚马逊演讲嘉宾科技博主极星会首批签约作者 &#x1f3c6; 推荐专栏&#xff1a; &#x1f3c5;…

深入浅出理解ArrayBuffer对象TypedArray和DataView视图

目录 举例理解 1. ArrayBuffer对象 2. TypedArray 3. DataView 总结 具体讲解 1. ArrayBuffer对象 2. TypedArray 3. DataView 注意事项 举例理解 先举个简单的例子理解ArrayBuffer对象TypedArray和DataView视图的概念和之间的关系 1. ArrayBuffer对象 想象一个场景…