【回溯算法】(第七篇)

目录

⼦集(medium)

题目解析

讲解算法原理

编写代码

找出所有⼦集的异或总和再求和(easy)

题目解析

讲解算法原理

编写代码


⼦集(medium)

题目解析

1.题目链接:. - 力扣(LeetCode)

2.题目描述

给你⼀个整数数组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中的所有元素互不相同

讲解算法原理

解法:算法思路:

为了获得nums数组的所有⼦集,我们需要对数组中的每个元素进⾏选择或不选择的操作,即nums数组⼀定存在2^(数组⻓度)个⼦集。对于查找⼦集,具体可以定义⼀个数组,来记录当前的状态,并对其进⾏递归。
对于每个元素有两种选择:

1.不进⾏任何操作;

2.将其添加⾄当前状态的集合。在递归时我们需要保证递归结束时当前的状态与进⾏递归操作前的状态不变,⽽当我们在选择进⾏步骤2进⾏递归时,当前状态会发⽣变化,因此我们需要在递归结束时撤回添加操作,即进⾏回溯。
递归函数设计:voiddfs(vector<vector<int>>&res,vector<int>&ans,vector<int>&nums,intstep)
参数:step(当前需要处理的元素下标);

返回值:⽆;
函数作⽤:查找集合的所有⼦集并存储在答案列表中。
递归流程如下:
1. 递归结束条件:如果当前需要处理的元素下标越界,则记录当前状态并直接返回;

2. 在递归过程中,对于每个元素,我们有两种选择:
◦ 不选择当前元素,直接递归到下⼀个元素;
◦ 选择当前元素,将其添加到数组末尾后递归到下⼀个元素,然后在递归结束时撤回添加操作;3. 所有符合条件的状态都被记录下来,返回即可。

编写代码

c++算法代码:

// 解法⼀:
class Solution
{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);}
};
// 解法⼆:
class Solution
{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(); // 恢复现场}}
};

java算法代码:

// 解法⼀:
class Solution
{List<List<Integer>> ret;List<Integer> path;public List<List<Integer>> subsets(int[] nums) {ret = new ArrayList<>();path = new ArrayList<>();dfs(nums, 0);return ret;}public void dfs(int[] nums, int pos){if(pos == nums.length){ret.add(new ArrayList<>(path));return;}// 选path.add(nums[pos]);dfs(nums, pos + 1);path.remove(path.size() - 1); // 恢复现场 // 不选dfs(nums, pos + 1);}
}
// 解法⼆:
class Solution
{List<List<Integer>> ret;List<Integer> path;public List<List<Integer>> subsets(int[] nums) {ret = new ArrayList<>();path = new ArrayList<>();dfs(nums, 0);return ret;}public void dfs(int[] nums, int pos){ret.add(new ArrayList<>(path));for(int i = pos; i < nums.length; i++){path.add(nums[i]);dfs(nums, i + 1);path.remove(path.size() - 1); // 恢复现场 }}
}

找出所有⼦集的异或总和再求和(easy)

题目解析

1.题目链接:. - 力扣(LeetCode)

2.题目描述

⼀个数组的异或总和定义为数组中所有元素按位XOR的结果;如果数组为空,则异或总和为0。例如,数组[2,5,6]的异或总和为2XOR5XOR6=1。
给你⼀个数组nums,请你求出nums中每个⼦集的异或总和,计算并返回这些值相加之和。注意:在本题中,元素相同的不同⼦集应多次计数。
数组a是数组b的⼀个⼦集的前提条件是:从b删除⼏个(也可能不删除)元素能够得到a。
• ⽰例1:
输⼊:nums=[1,3]输出:6
解释:[1,3]共有4个⼦集:• 空⼦集的异或总和是0。• [1]的异或总和为1。
• [3]的异或总和为3。• [1,3]的异或总和为1XOR3=2。0+1+3+2=6
• ⽰例2:
输⼊:nums=[5,1,6]输出:28
解释:[5,1,6]共有8个⼦集:• 空⼦集的异或总和是0。
• [5]的异或总和为5。
• [1]的异或总和为1。
• [6]的异或总和为6。
• [5,1]的异或总和为5XOR1=4。
• [5,6]的异或总和为5XOR6=3。
• [1,6]的异或总和为1XOR6=7。
• [5,1,6]的异或总和为5XOR1XOR6=2。
0+5+1+6+4+3+7+2=28
• ⽰例3:
输⼊:nums=[3,4,5,6,7,8]
输出:480
解释:每个⼦集的全部异或总和值之和为480。
• 提⽰:
1<=nums.length<=12
1<=nums[i]<=20

讲解算法原理

解法(递归):
算法思路:

所有⼦集可以解释为:每个元素选择在或不在⼀个集合中(因此,⼦集有 个)。本题我们需要求出所有⼦集,将它们的异或和相加。因为异或操作满⾜交换律,所以我们可以定义⼀个变量,直接记录当前状态的异或和。使⽤递归保存当前集合的状态(异或和),选择将当前元素添加⾄当前状态与否,并依次递归数组中下⼀个元素。当递归到空元素时,表⽰所有元素都被考虑到,记录当前状态(将当前状态的异或和添加⾄答案中)。
例如集合中的元素为[1,2],则它的⼦集状态选择过程如下:

        []
   /          \
 []            [1]           //第⼀个元素选择与否
 / \         /      \
 [] [2]   [1] [1, 2]     //第⼆个元素选择与否,每个状态到这⼀层时需要记录异或和

递归函数设计:voiddfs(intval,intidx,vector<int>&nums)
参数:val(当前状态的异或和),idx(当前需要处理的元素下标,处理过程:选择将其添加⾄当前状态或不进⾏操作);
返回值:⽆;
函数作⽤:选择对元素进⾏添加与否处理。
递归流程:
1. 递归结束条件:当前下标与数组⻓度相等,即已经越界,表⽰已经考虑到所有元素;
a. 将当前异或和添加⾄答案中,并返回;
2. 考虑将当前元素添加⾄当前状态,当前状态更新为与当前元素值的异或和,然后递归下⼀个元素;

3. 考虑不选择当前元素,当前状态不变,直接递归下⼀个元素; 

编写代码

c++算法代码:

class Solution
{int path;int sum;
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]; // 恢复现场}}
};

java算法代码:

class Solution
{int path;int sum;public int subsetXORSum(int[] nums) {dfs(nums, 0);return sum;}public void dfs(int[] nums, int pos){sum += path;for(int i = pos; i < nums.length; i++){path ^= nums[i];dfs(nums, i + 1);path ^= nums[i]; // 恢复现场}}
}

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

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

相关文章

技术干货|如何巧妙利用数字孪生技术助力口腔保健分析

行业&#xff1a; 口腔医疗 挑战&#xff1a; 传统方法缺乏预测口腔内受力状态&#xff0c;也很难从患者方面获得反馈&#xff0c;因此将口腔扫描、牙齿形状/位置识别和正畸数字模型生成的过程数字化是一个重大机会。 正畸治疗是牙科中最大的类别之一&#xff0c;随着病例的…

ubuntu 挂载 新 硬盘 ext3

ubuntu 挂载 新 硬盘 在Ubuntu中使用新的硬盘并格式化为ext3文件系统&#xff0c;你需要执行以下步骤&#xff1a; 插入硬盘并确认系统已识别。 确定硬盘的设备名称&#xff0c;例如 /dev/sdb。 使用mkfs.ext3命令格式化硬盘为ext3文件系统。 以下是具体的命令&#xff1a…

Spring 设计模式之装饰器模式

Spring 设计模式之装饰器模式 装饰器模式用到的场景具体的java例子&#xff1a; 装饰器模式 装饰器模式允许我们在不修改原始类&#xff08;即被装饰对象&#xff09;的情况下&#xff0c;动态地向对象添加新的行为或修改现有行为。 用到的场景 存在一个原始类&#xff0c;在…

星巴克们需要找回节奏

“重返星巴克”需要更多运气。 作者|金豫 编辑|杨舟 国内咖啡市场正上演着一场后浪推前浪的经典剧目。 近期&#xff0c;“太平洋咖啡”传出大规模关店的消息。该品牌在多座城市中仅剩下几家门店&#xff0c;且多数集中在机场。而在2016年前后&#xff0c;太平洋咖啡一度超越…

React 前端框架全面教程:从入门到进阶

React 前端框架全面教程&#xff1a;从入门到进阶 引言 在现代前端开发中&#xff0c;React 作为一款流行的 JavaScript 库&#xff0c;以其组件化、声明式的特性和强大的生态系统&#xff0c;成为了开发者的首选。无论是构建单页应用&#xff08;SPA&#xff09;还是复杂的用…

【日志】网络传输协议TCP/UDP/HTTP // unity泛型类单例模式

2024.10.23 【力扣刷题】 暂无 【数据结构】 暂无 【其他】 TCP&#xff08;传输控制协议&#xff09;&#xff08;长连接&#xff09;&#xff1a; TCP 是一种面向连接的、可靠的协议&#xff0c;它通过三次握手建立连接&#xff0c;确保数据的可靠传输。 第一次是客户端向服…

【力扣 + 牛客 | SQL题 | 每日4题】牛客大厂面试真题W3,W10

1. 牛客大厂面试真题SQLW3&#xff1a;分析客户逾期情况 1.1 题目&#xff1a; 描述 有贷款信息表&#xff1a;loan_tb&#xff08;agreement_id&#xff1a;合同id&#xff0c;customer_id&#xff1a;客户id&#xff0c;loan_amount&#xff1a;贷款金额&#xff0c;pay_a…

在 Windows 中使用 GCC 编译运行 C++

在 Windows 中使用 GCC 编译开发 C 通过 MSYS2 安装 MinGW 工具链 MSYS2&#xff08;Minimal SYStem 2&#xff09;是一个集成了大量的GNU工具链、工具和库的开源软件包集合。它提供了一个类似于 Linux 的shell环境&#xff0c;可以在 Windows 系统中编译和运行许多 Linux 应…

铝基板PCB创建助手

支持在创建元件时创建网表 支持圆形和矩形阵列布局 支持板框信息修改 支持缺口位置修改 支持元件封装预览 支持原理图预览 支持PCB板框和布局预览 支持灯珠方向更改为切向和径向 支持报告输出 支持元件封装选择 铝基板PCB创建助手 V1.0

Nginx 配置基于IP 地址的 Web 服务器

Nginx 配置基于IP 地址的 Web 服务器 1.配置网卡 nmcli connection modify ipv4.address 192.168.232.130/24 ipv4.gateway 192.168.232.2 ipv4.dns 192.168.232.2 ipv4.method manual connection.autoconnect yes 2.添加ip地址 nmcli connection modify ens160 ipv4.address…

如何理解全局和局部的规律

再和大家聊的话题是全局和局部的辩证关系。 研究全局和局部的辩证关系&#xff0c;研究的就是做事的方法。 不过这里说的做事的方法不是具体的执行办法&#xff0c;比如这一步应该怎么做&#xff0c;那一步应该怎么做。 而是重在思考&#xff0c;应该先做什么&#xff0c;后…

GPT-Sovits-2-微调模型

1. 大致步骤 上一步整理完数据集后&#xff0c;此步输入数据, 微调2个模型VITS和GPT&#xff0c;位置在 <<1-GPT-SoVITS-tts>>下的<<1B-微调训练>> 页面的两个按钮分别执行两个文件: <./GPT_SoVITS/s2_train.py> 这一步微调VITS的预训练模型…

SQLite 数据库设计最佳实践

SQLite特点 SQLite是一款功能强大的 轻量级嵌入式数据库 ,具有以下显著特点: 体积小 :最低配置仅需几百KB内存,适用于资源受限环境。 高性能 :访问速度快,运行效率高于许多开源数据库。 高度可移植 :兼容多种硬件和软件平台。 零配置 :无需复杂设置,开箱即用。 自给自…

【Linux】ClickHouse 部署

搭建Clickhouse集群时&#xff0c;需要使用Zookeeper去实现集群副本之间的同步&#xff0c;所以需要先搭建zookeeper集群 1、卸载 # 检查有哪些clickhouse依赖包&#xff1a; [rootlocalhost ~]# yum list installed | grep clickhouse# 移除依赖包&#xff1a; [rootlocalho…

【LeetCode】两数之和、大数相加

主页&#xff1a;HABUO&#x1f341;主页&#xff1a;HABUO 1.两数之和 题目&#xff1a;给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一…

计算机毕业设计——ssm基于JAVA的OA办公系统的设计与实现演示录像2021

作者&#xff1a;程序媛9688开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等。 &#x1f31f;文末获取源码数据库&#x1f31f;感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff08;免费咨询指导选题&#xff09;&#xff0…

根据输入的详细地址解析经纬度

摘要&#xff1a; 今天遇到一个需求&#xff1a;就是做客户导入的时候因为导入的客户地址的时候没有经纬度的&#xff0c;但是同步的时候需要经纬度的&#xff0c;所以还是要根据客户提供的详细地址解析出来对应的经纬度&#xff01;回填到对应的经纬度的表单之中进行客户的同步…

【文心智能体 | AI大师工坊】如何使用智能体插件,完成一款旅游类智能体的开发,来体验一下我的智能体『​​​​​​​背包客』

&#x1f680;『背包客』点击前往体验&#xff1a;https://mbd.baidu.com/ma/s/d7RHMlWh 最近参加了百度文心智能体平台AI大师工坊&#x1f389;活动&#xff0c;在这个活动中&#xff0c;我利用文心平台提供的各种插件、大模型等工具&#xff0c;打造了一个工具类的智能体应用…

使用Docker Compose简化微服务部署

文章目录 Docker Compose简介安装Docker Compose在Windows上安装Docker Compose在macOS上安装Docker Compose在Linux上安装Docker Compose 创建Docker Compose文件创建compose文件构建并运行服务 使用Docker Compose网络定义网络验证网络连接 使用Docker Compose卷定义卷使用卷…

WPF的触发器(Trigger)

WPF&#xff08;Windows Presentation Foundation&#xff09;是微软.NET框架的一部分&#xff0c;用于构建Windows客户端应用程序。在WPF中&#xff0c;触发器&#xff08;Triggers&#xff09;是一种强大的功能&#xff0c;允许开发者根据控件的状态或属性值来动态改变控件的…