LeetCode刷题--- 子集

 个人主页:元清加油_【C++】,【C语言】,【数据结构与算法】-CSDN博客

个人专栏

  • 力扣递归算法题【  http://t.csdnimg.cn/yUl2I   】
  • 【C++】          【  http://t.csdnimg.cn/6AbpV 】
  • 数据结构与算法【  http://t.csdnimg.cn/hKh2l  】

前言:这个专栏主要讲述递归递归、搜索与回溯算法,所以下面题目主要也是这些算法做的  

我讲述题目会把讲解部分分为3个部分:
1、题目解析

2、算法原理思路讲解

3、代码实现


子集

题目链接:子集

题目

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

解法

题目解析

题目意思很简单,给我们一个数组,返回其 所有可能的子集

示例 1:

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

算法原理思路讲解    

解法一

为了获得 nums 数组的所有⼦集,我们需要对数组中的每个元素进⾏选择或不选择的操作,即nums 数组⼀定存在 【2^数组⻓度】 个⼦集。对于查找⼦集,具体可以定义⼀个数组,来记录当前的状态,并对其进⾏递归。对于每个元素有两种选择:1. 不进⾏任何操作;2. 将其添加⾄当前状态的集合。在递归时我们需要保证递归结束时当前的状态与进⾏递归操作前的状态不变,⽽当我们在选择进⾏步骤 2 进⾏递归时,当前状态会发⽣变化,因此我们需要在递归结束时撤回添加操作,即进⾏回溯。
一、画出决策树

决策树就是我们后面设计函数的思路


 二、设计代码

(1)全局变量

vector<vector<int>> ret;vector<int> path;

(2)设计递归函数

void dfs(vector<int>& nums, int pos);
递归流程如下
  1. 递归结束条件:如果当前需要处理的元素下标越界,则记录当前状态并直接返回;
  2. 在递归过程中,对于每个元素,我们有两种选择:
    1. 不选择当前元素,直接递归到下⼀个元素;
    2. 选择当前元素,将其添加到数组末尾后递归到下⼀个元素,然后在递归结束时撤回添加操作;
  3. 所有符合条件的状态都被记录下来,返回即可。

解法二 

一、画出决策树

决策树就是我们后面设计函数的思路


 二、设计代码

(1)全局变量

vector<vector<int>> ret;vector<int> path;

1.递归函数头设计

void dfs(vector<int>& nums, int pos);

参数:nums 数组,pos 在数组中的位置 

递归流程如下
  1. 在递归过程中,对于每个元素,我们只能向后选择
    1. 选择当前元素,将其添加到数组末尾后递归到下⼀个元素,然后在递归结束时撤回添加操作(也即是回溯)
  2. 所有符合条件的状态都被记录下来,返回即可。

 


代码实现

解法一

时间复杂度:O(n×2^n)。一共 2^n个状态,每种状态需要 O(n) 的时间来构造子集。

空间复杂度:O(n)。临时数组 t 的空间代价是 O(n),递归时栈空间的代价为 O(n)。

class Solution
{vector<vector<int>> ret;vector<int> path;
public: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);}vector<vector<int>> subsets(vector<int>& nums) {dfs(nums, 0);return ret;}};

解法二

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(); // 恢复现场}}
};

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

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

相关文章

【大数据实训】python石油大数据可视化(八)

2014到2020年石油加工产品产量数据处理分析 一、任务描述 石油是工业的命脉。 一直到2020年&#xff0c;我国原油产量基本处于平稳的状态&#xff0c;大部分原油来自国外进口&#xff1b;中国原油加工产量在华东、东北地区占比较大&#xff0c;华南地区相对较少。原油的加工…

融云观察:给 ChatGPT 加上声音和脸庞,AI 社交的多模态试验

&#xff08;&#x1f446;点击获取行业首款《社交泛娱乐出海作战地图》&#xff09; 如果将短剧的爆火简单粗暴地归因为剧情上头、狗血反转和精妙卡点&#xff0c;那 GenAI 世界这一年来可以说是一部短剧 Live Show。关注【融云全球互联网通信云】了解更多 这厢 Open AI 宫斗…

2023年全球架构师峰会(ArchSummit北京站2023)-核心PPT资料下载

一、峰会简介 ArchSummit聚焦业界强大的技术成果&#xff0c;秉承“实践第一、案例为主”的原则&#xff0c;展示先进技术在行业中的典型实践&#xff0c;以及技术在企业转型、发展中的推动作用。旨在帮助技术管理者、CTO、架构师做好技术选型、技术团队组建与管理&#xff0c…

Spring Cloud+SpringBoot b2b2c:Java商城实现一件代发设置及多商家直播带货商城 免 费 搭 建

【saas云平台】打造全行业全渠道全场景的saas产品&#xff0c;为经营场景提供一体化解决方案&#xff1b;门店经营区域化、网店经营一体化&#xff0c;本地化、全方位、一站式服务&#xff0c;为多门店提供统一运营解决方案&#xff1b;提供丰富多样的营销玩法覆盖所有经营场景…

静态路由及动态路由

文章目录 静态路由及动态路由一、静态路由基础1. 静态路由配置2. 负载分担3. 路由备份4. 缺省路由5. 静态路由实操 二、RIP 动态路由协议1. RIP 协议概述2. RIP 协议版本对比2.1 有类路由及无类路由 3. RIP 路由协议原理4. RIP 计时器5. 度量值6. 收敛7. 示例 静态路由及动态路…

【大数据面试】Flink面试题附答案

目录 ✅Flink介绍、特点、应用场景 ✅Flink与Spark Streaming的区别 ✅Flink有哪些部署模式 ✅Flink架构 ✅怎么设置并行度&#xff1f; ✅什么是算子链&#xff1f; ✅什么是任务槽&#xff08;Task Slots&#xff09;&#xff1f; ✅任务槽和并行度的关系 ✅Flink作…

Java 中单例模式的常见实现方式

目录 一、什么是单例模式&#xff1f; 二、单例模式有什么作用&#xff1f; 三、常见的创建单例模式的方式 1、饿汉式创建 2、懒汉式创建 3、DCL&#xff08;Double Checked Lock&#xff09;双检锁方式创建 3.1、synchronized 同步锁的基本使用 3.2、使用 DCL 中存在的疑…

论文学习——泰森多边形法在小流域面雨量计算中的应用

文章目录 0 摘要00 引言1 研究区域概况2 泰森多边形的建立3 流域多年面降雨量分析4 典型降雨场次面雨量分析5 典型降雨日面雨量分析6 结论7 个人总结0 摘要 研究泰森多边形算法,在小流域面雨量计算中的适用性。选取3种不同降雨量实例,流域多年面降雨量、典型场次、典型日面雨…

ESP32 - Thonny+MicroPython PC远程控制ESP32 LED灯

①PC远程控制ESP32 LED灯 网络调试助手下载地址&#xff1a;http://www.cmsoft.cn/resource/102.html ②ESP32代码 # 整体流程 # 1. 链接wifi # 2. 启动网络功能&#xff08;UDP&#xff09; # 3. 接收网络数据 # 4. 处理接收的数据import socket import time import netwo…

火车头破解版https处理插件怎么安装使用

火车头7.6破解版https处理插件可以 https处理插件破解版 用于火车头7.6破解版采集https。测试OK。分享给需要的站站长。放入如图目录便可

【大数据存储与处理】实验三 MongoDB 数据库操作

实验三 MongoDB 数据库操作 【实验目的】&#xff1a; 1. 掌握 MongoDB 数据库的基本概念 2. 掌握 MongoDB 创建数据库 3. 掌握 MongoDB 删除数据库 【实验内容与要求】&#xff1a; MongoDB 是一个开源文档数据库&#xff0c;提供高性能&#xff0c;高可用性和自动扩展&…

泛微OA移动端增加通知公告应用

1、集成中心-移动配置应用中心-移动平台应用管理-新建 应用设置&#xff1a; 2、集成中心-移动配置应用中心-应用入口页面管理-默认页面